题解:带权并查集
建议大家先学习一下HDU3038,其它的都一样。代码如下
#include <bits/stdc++.h>
using namespace std;
int const N = 100000 + 10;
int n,m,q,fa[N],val[N];
void Init(){
for(int i=0;i<=n;i++) fa[i] = i,val[i] = 0;
}
int find(int x){
if(x != fa[x]){
int t = fa[x];
fa[x] = find(fa[x]);
val[x] += val[t];
}
return fa[x];
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m>>q;
int x,y,s;
Init();
for(int i=1;i<=m;i++){
cin>>x>>y>>s;
int px = find(x), py = find(y);
if(px != py){
fa[px] = py;
val[px] = s + val[y] - val[x];
}
}
for(int i=1;i<=q;i++){
cin>>x>>y;
int px = find(x), py = find(y);
if(px != py) cout<<-1<<endl;
else cout<<val[x] - val[y]<<endl;
}
return 0;
}