简单的说,就是以最左边的点为根节点。
然后用rank[]记录该点到根节点(也就是最左侧)的距离。
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 200010
#define rank ranks
int f[maxn],rank[maxn];
int find(int x){
if(x==f[x])return x;
int tmp = find(f[x]);
rank[x]+=rank[f[x]];//x到根节点的距离加上其父亲到根节点的距离
f[x] = tmp;
return f[x];
}
int main()
{
int n,m;
while (scanf("%d%d", &n, &m) != EOF) {
int ans = 0;
for(int i=1;i<=n+1;i++)f[i] = i,rank[i]=0;
for(int i=1;i<=m;i++)
{
int ai,bi,si;
cin>>ai>>bi>>si;
bi++;//化闭区间为开区间
int fa = find(ai);
int fb = find(bi);
if(fa!=fb){
f[fb] = fa;
//画图说明
rank[fb] = rank[ai]+si-rank[bi];
}
else{//在同一个集合中
if(si!=rank[bi]-rank[ai])
ans++;
}
}
cout<<ans<<endl;
}
}