题意:我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的!两个节点间可能有多条边,不过一条边的两端必然是不同的节点。每个节点都有一个能量值。
现在我们要编写一个项目管理软件,这个软件呢有两个操作:
1.给某个项目的能量值加上一个特定值。
2.询问跟一个项目相邻的项目的能量值之和。(如果有多条边就算多次,比如a和b有2条边,那么询问a的时候b的权值算2次)。
链接:点我
暴力过
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 #define pb(a) push_back(a) 11 const int INF=0x3f3f3f3f; 12 const double eps=1e-5; 13 typedef long long ll; 14 #define cl(a) memset(a,0,sizeof(a)) 15 #define ts printf("***** "); 16 const int MAXN=100005; 17 int val[MAXN]; 18 int n,m,tt,cnt; 19 vector<int> vc[MAXN]; 20 int main() 21 { 22 int i,j,k; 23 #ifndef ONLINE_JUDGE 24 freopen("1.in","r",stdin); 25 #endif 26 scanf("%d",&tt); 27 while(tt--) 28 { 29 scanf("%d%d",&n,&m); 30 int a,b; 31 for(i=0;i<=n;i++) 32 { 33 vc[i].clear(); 34 } 35 for(i=0;i<m;i++) 36 { 37 scanf("%d%d",&a,&b); 38 vc[a].pb(b); 39 vc[b].pb(a); 40 } 41 for(i=0;i<=n;i++) val[i]=0; 42 scanf("%d",&k); 43 while(k--) 44 { 45 int f,id,w; 46 scanf("%d",&f); 47 if(f==0) 48 { 49 scanf("%d%d",&id,&w); 50 val[id]+=w; 51 } 52 else 53 { 54 scanf("%d",&w); 55 int sum=0; 56 for(i=0;i<vc[w].size();i++) 57 { 58 sum+=val[vc[w][i]]; 59 } 60 printf("%d ",sum); 61 } 62 } 63 } 64 }