hdu 4858 圖的模擬+vector 簡單題
阿新 • • 發佈:2019-02-11
專案管理
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2367 Accepted Submission(s): 899
Problem Description 我們建造了一個大專案!這個專案有n個節點,用很多邊連線起來,並且這個專案是連通的!
兩個節點間可能有多條邊,不過一條邊的兩端必然是不同的節點。
每個節點都有一個能量值。
現在我們要編寫一個專案管理軟體,這個軟體呢有兩個操作:
1.給某個專案的能量值加上一個特定值。
2.詢問跟一個專案相鄰的專案的能量值之和。(如果有多條邊就算多次,比如a和b有2條邊,那麼詢問a的時候b的權值算2次)。
Input 第一行一個整數T(1 <= T <= 3),表示測試資料的個數。
然後對於每個測試資料,第一行有兩個整數n(1 <= n <= 100000)和m(1 <= m <= n + 10),分別表示點數和邊數。
然後m行,每行兩個數a和b,表示a和b之間有一條邊。
然後一個整數Q。
然後Q行,每行第一個數cmd表示操作型別。如果cmd為0,那麼接下來兩個數u v表示給專案u的能量值加上v(0 <= v <= 100)。
如果cmd為1,那麼接下來一個數u表示詢問u相鄰的專案的能量值之和。
所有點從1到n標號。
Output 對每個詢問,輸出一行表示答案。
Sample Input 1 3 2 1 2 1 3 6 0 1 15 0 3 4 1 1 1 3 0 2 33 1 2
Sample Output 4 15 15
題目大意:中文題目,給你點與點之間的關係,執行兩種操作,為1時給出結點的值增加相應的值,為0時查詢相鄰節點能量值之和。
解題思路:模擬題,直接模擬這個過程,用vector來儲存
[cpp] view plain copy print?
- //hdu 3823
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <string>
- #include <algorithm>
- #include <vector>
- usingnamespace std;
- //http://blog.csdn.net/qinlumoyan/article/details/38466997
- typedeflong
- constint maxn = 100000 + 5;
- int node[maxn];//記錄每一個點的權值
- vector<int> map[maxn];//記錄每一個點的相鄰點
- int main()
- {
- int t;
- scanf("%d", &t);
- int n, m;//頂點數和邊數
- int a, b;//相連的邊
- int oper;//操作次數
- int cmd;//操作型別
- int u, v;
- int ans;//答案、、權值數
- while (t--)
- {
- memset(node, 0, sizeof
- for (int i = 1; i <= maxn; i++) //清空vector
- map[i].clear();
- scanf("%d%d", &n, &m);
- for (int i = 1; i <= m; i++)
- {
- scanf("%d%d", &a, &b);
- map[a].push_back(b);//無向圖,正反兩次操作
- map[b].push_back(a);
- }
- scanf("%d", &oper);
- while (oper--)
- {
- scanf("%d", &cmd);
- if (!cmd)
- {
- scanf("%d%d", &u, &v);
- node[u] += v;
- }
- elseif (cmd==1)
- {
- ans = 0;
- scanf("%d", &u);
- for (int i = 0; i < map[u].size(); i++)
- {
- ans += node[map[u][i]];
- }
- printf("%d\n", ans);
- }
- }
- }//t
- system("pause");
- return 0;
- }
//hdu 3823
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
//http://blog.csdn.net/qinlumoyan/article/details/38466997
typedef long long ll;
const int maxn = 100000 + 5;
int node[maxn];//記錄每一個點的權值
vector<int> map[maxn];//記錄每一個點的相鄰點
int main()
{
int t;
scanf("%d", &t);
int n, m;//頂點數和邊數
int a, b;//相連的邊
int oper;//操作次數
int cmd;//操作型別
int u, v;
int ans;//答案、、權值數
while (t--)
{
memset(node, 0, sizeof(node));
for (int i = 1; i <= maxn; i++) //清空vector
map[i].clear();
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++)
{
scanf("%d%d", &a, &b);
map[a].push_back(b);//無向圖,正反兩次操作
map[b].push_back(a);
}
scanf("%d", &oper);
while (oper--)
{
scanf("%d", &cmd);
if (!cmd)
{
scanf("%d%d", &u, &v);
node[u] += v;
}
else if (cmd==1)
{
ans = 0;
scanf("%d", &u);
for (int i = 0; i < map[u].size(); i++)
{
ans += node[map[u][i]];
}
printf("%d\n", ans);
}
}
}//t
system("pause");
return 0;
}