hihoCoder1515

带权并查集 

边上权值表示u比v高多少分

 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4 int n,m,q,f[100100],s[100100];
 5 
 6 void ini(){
 7     for (int i=1;i<=n;i++){
 8         f[i]=i;
 9         s[i]=0;
10     }
11 }
12 
13 int getf(int u){
14     if (u!=f[u]){
15         int tmp=f[u];
16         f[u]=getf(f[u]);
17         s[u]+=s[tmp];
18     }
19     return f[u];
20 }
21 
22 void merge(int u,int v,int w){
23     int uf=getf(u),vf=getf(v);
24     if (uf!=vf){
25         f[uf]=vf;
26         s[uf]=-s[u]+w+s[v];
27     }
28 }
29 
30 int query(int u,int v){
31     int uf=getf(u),vf=getf(v);
32     if (uf!=vf) return -1;
33     return s[u]-s[v];
34 }
35 
36 int main()
37 {
38     cin>>n>>m>>q;
39     ini();
40     while (m--){
41         int x,y,s;
42         cin>>x>>y>>s;
43         merge(x,y,s);
44     }
45     while (q--){
46         int x,y;
47         cin>>x>>y;
48         cout<<query(x,y)<<endl;
49     }
50     return 0;
51 }

 

posted @ 2020-05-08 18:12  White_Li  阅读(281)  评论(0)    收藏  举报