每次给你 从下标a到下标b和为多少,如果与前面给的合法情况不冲突,即为合法情况否则不考虑为错误情况,统计错误情况个数
Sum[]数组代表它到父亲节点前的和,然后整体算法进行向量合成运算
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int fa[200010],Sum[200010];
int n,k,pre,a,b;
void init()
{
for(int i=0;i<=n;i++)
{
fa[i] = i;
Sum[i] = 0;
}
}
int getFather(int x)
{
if(x==fa[x])return x;
int pre = fa[x];
fa[x] = getFather(fa[x]);
Sum[x]+=Sum[pre];
return fa[x];
}
int Union(int sum,int a,int b)
{
int faa = getFather(a),fab = getFather(b);
if(faa==fab)
{
if(Sum[b]-Sum[a]!=sum)return 1;
else return 0;
}
else{
fa[fab] = faa;
Sum[fab] = Sum[a]+sum-Sum[b];
return 0;
}
return 0;
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
int sum = 0;
init();
while(k--)
{
scanf("%d%d%d",&a,&b,&pre);
a--;
sum+=Union(pre,a,b);
}
printf("%d\n",sum);
}
return 0;
}