题目大意:中文题目,给你点与点之间的关系,执行两种操作,为1时给出结点的值增加相应的值,为0时查询相邻节点能量值之和。
解题思路:模拟题,如果学过图论或者STL中的vector,这个题就很简单了。直接就是模拟这个过程,用vector来存储,可以很快捷和方便的计算,详见code。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4858
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int MAXN = 100000+10;
int n,m,t,a,b,u,v,q,cmd,node[MAXN],ans;
vector<int> map[MAXN];
int main(){
scanf("%d",&t);
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",&q);
while(q--){
scanf("%d",&cmd); //接收操作
if(cmd==0){
scanf("%d%d",&u,&v); //将节点值更新
node[u]+=v;
}
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);
}
}
}
return 0;
}