带权并查集,不是很能看懂这个的推算过程,先写下以后再看几遍
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=200050;
int par[MAXN],val[MAXN];
void init()
{
for(int i=1;i<=MAXN;i++)
par[i]=i,val[i]=0;
}
int find(int x)
{
if(x==par[x])
return x;
else
{
int root=find(par[x]);
val[x]+=val[par[x]];
return par[x]=root;
}
}
int main()
{
int n,m;
int a,b,c;
while(cin>>n>>m)
{
int ans=0;
init();
while(m--)
{
cin>>a>>b>>c;
a--;
int t1=find(a);
int t2=find(b);
if(t1!=t2)
{
par[t2]=t1;
val[t2]=val[a]-val[b]+c;
}
else
if(val[a]+c!=val[b])
ans++;
}
cout<<ans<<endl;
}
return 0;
}