并查集 食物链 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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章