本题关键是记录每个顶点代表的值,然后又要记录最左端记录的值,并且本题的输入部分要用EOF来,输入有多组连续的数据
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
const int maxn=400000+2000;
int par[maxn],val[maxn];
int n,ans;
int find(int x)
{
int k=par[x];
if(x!=k)
{
par[x]=find(k);
val[x]+=val[k];
}
return par[x];
}
void Union(int x,int y)
{
par[find(x)]=find(y);
}
void init()
{
ans=0;
for(int i=0;i<=n;i++)
{
val[i]=0;
par[i]=i;
}
}
int main()
{
int m,a,b,c;
//freopen("D.txt","r",stdin);
while(scanf("%d %d",&n,&m)!=EOF)
{
//cout<<maxn<<endl;
init();
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&a,&b,&c);
a--;
//cout<<a<<b<<c<<endl;
int L1=find(a),L2=find(b);
if(L1==L2&&val[a]+c!=val[b])
{
//cout<<L1<<L2<<endl;
ans++;
}
else if(L1<L2)
{
par[L2]=L1;
val[L2]=val[a]-val[b]+c;
}
else if(L1>L2)
{
par[L1]=L2;
val[L1]=val[b]-val[a]-c;
}
}
printf("%d\n",ans);
}
return 0;
}