一道略坑爹的并查集
输入N M 表示一共多少个数,和数据组数
就下来M行
输入a,b,c,表示从第a个数加到第b个数,和为c(包括a,b)
计算出共有多少组矛盾的数据
提示
1)将和存在num[i]中,每次find就更新
#include <stdio.h>
#include <string.h>
#define maxn 200005
int f[maxn];
int num[maxn];
int find(int i)
{
if(i==f[i])
return f[i];
int a=f[i];
f[i]=find(f[i]);
num[i]=num[a]+num[i]; //更新num
return f[i];
}
int main()
{
int n,m;
int i,j;
int a,b,c;
int sum;
while(scanf("%d%d",&n,&m)!=-1)
{
sum=0;
for(i=0;i<=n;i++)
{
num[i]=0;
f[i]=i;
}
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
a--; //也可以用b++,因为包括端点,所以(1,4)与(5,10)的并集才是(1,10)!!!
int fr,ed;
fr=find(a);
ed=find(b);
if(fr<ed)
{
f[fr]=ed;
num[fr]=num[b]+c-num[a];
}
else if(fr>ed)
{
f[ed]=fr;
num[ed]=num[a]-c-num[b];
}
else
{
if(num[a]-num[b]!=c)
{
sum++; //只有这一种情况可能出错
continue;
}
}
/*for(i=0;i<=n;i++)
printf("%d %d %d\n",i,f[i],num[i]);
printf("\n");*/
}
printf("%d\n",sum);
}
return 0;
}