一道略坑爹的並查集
輸入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;
}