题目链接:22并查集 - Virtual Judge (vjudge.net)
整体思路:qz数组用来记录和与根节点的大小,每次输入后更新,然后当输入两个数在同一根树上时就判断是否大小正确。
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
typedef int ll;
using namespace std;
int f[200005];
int qz[200005];
int find(int x){
if(f[x]!=x) {
int t=f[x];
f[x]=find(f[x]);
qz[x]+=qz[t];
}
return f[x];
}
ll n,m;
int main(){
while(~scanf("%d %d",&n,&m)){
ll sum=0;
for(int i=0;i<=n;i++){
f[i]=i;
qz[i]=0;
}
while(m--){
int x,y,z;
cin>>x>>y>>z;
x--;
int a=find(x),b=find(y);
if(a!=b){
f[b]=a;
qz[b]=qz[x]+z-qz[y];
}
else {
if(qz[y]-qz[x]!=z)sum++;
}
}
cout<<sum<<endl;
}
}