並查集 How Many Answers Are Wrong HDU 3038

一道略坑爹的並查集

輸入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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章