并查集,左端点并到右端点里,所以左端点需要减一:(1,2)(3,4)可以合并。
#include<stdio.h>
#include<string.h>
int p[200005];
int dis[200005];
int find(int n)
{
int item=n;
if(p[n]!=n)
{
item=find(p[n]);
dis[n]+=dis[p[n]];
}
return p[n]=item;
}
int main()
{
int n,m,a,b,atob,ans;
while(scanf("%d%d",&n,&m)!=EOF)
{
ans=0;
for(int i=0;i<=n;i++)
{
p[i]=i;
}
memset(dis,0,sizeof(dis));
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&atob);
a--;
int pa=find(a);
int pb=find(b);
//printf("%d------%d\n",pa,pb);
if(pa==pb)
{
if(dis[b]-dis[a]!=atob)
{
ans++;
}
}
else
{
dis[pb]=dis[a]-dis[b]+atob;
p[pb]=pa;
}
}
printf("%d\n",ans);
}
}