主要就是a--的理解。
我的理解是 比如说 4,4 把点化作线段。把孤立的点变成连续的线。
4,4 的意义的3-4 这第四块的长度,也就是权值。
所以 3 和 4 这两个点之间存在通路。是一个连通图。。
如果不连通的话,直接就加上去就行了。如果连通的话就要判断是否为假话了
4,4 转化成 3-4
这样的话下面这句话也比较好理解了。能这么做也是因为 题目给的a<=b
sum[pb]+=sum[a]+k-sum[b];
因为是f[pb]=pa;这样处理的。。
所以pb<=b pa<=a
#include<iostream>
#include<cstring>
using namespace std;
#define N 200000+5
int f[N];
int sum[N];
int find(int x){
if(x!=f[x]){
sum[x]+=sum[f[x]];
f[x]=find(f[x]);
}
return f[x];
}
int main(){
int n,m;
while(cin>>n>>m){
memset(sum,0,sizeof(sum));
for(int i=0;i<=n;i++){
f[i]=i;
}
int flag=0;
int a,b,k;
for(int i=0;i<m;i++){
cin>>a>>b>>k;
a--; //重点
int pa=find(a);
int pb=find(b);
if(pa!=pb){
f[pb]=pa;
sum[pb]+=sum[a]+k-sum[b];
}
else{
if(sum[b]-sum[a]!=k){
flag++;
}
}
}
cout<<flag<<endl;
}
}