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 }

浙公网安备 33010602011771号