並查集 食物鏈 POJ1182

#include <stdio.h>
#include <string.h>
int f[50005];
int rank[50005];              //rank[x]值爲0,則與父節點同級,爲1則被父節點吃,爲2則吃父節點
int find(int i)
{
	if(i==f[i])
		return f[i];
	int a=f[i];
	f[i]=find(f[i]);
	rank[i]=(rank[i]+rank[a])%3;
	return f[i];
}
int main()
{
	int n,k;
	int i;
	int d,x,y;
	int sum;
	int fr,ed;
	scanf("%d%d",&n,&k);                     //注意不能打while,會WA
	{
		sum=0;
		for(i=0;i<=n;i++)
		{
			f[i]=i;
			rank[i]=0;
		}
		for(i=0;i<k;i++)
		{
			scanf("%d%d%d",&d,&x,&y);
			if(x>n||y>n||(d==2&&x==y))
			{
				sum++;
				continue;
			}
			d-=1;
			fr=find(x);
			ed=find(y);
			if(fr==ed)
			{
				if((rank[y]-rank[x]+3)%3!=d)         //歸納所有情況得出的結論
				{
					sum++;
					continue;
				}
			}
			else
			{
				f[ed]=fr;
				rank[ed]=(rank[x]-rank[y]+3+d)%3;           //若兩點不在同一集合,則合併父節點 
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}


發佈了58 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章