POJ 1182 食物链

题目链接:~( ̄▽ ̄~)(~ ̄▽ ̄)~


思路:用并查集,用rank[x]表示该节点与父节点的关系,rank[x] = 0表示同类 , rank[x] = 1表示吃 ,rank[x] = 2表示被吃

在网上看了半天的向量法,图都没有个,看都看不懂,还是画图就懂了(没图没真相ㄟ(▔,▔)ㄏ )

                                       POJ 1182 食物链_第1张图片

                                        POJ 1182 食物链_第2张图片

由图观之思路差不多就出来了


code:

#include <stdio.h>
int d = 0, fx = 0, fy = 0, father[500005], rank[500005];
int find(int x)
{
	int item = father[x];
	if(x != father[x])
	{
		father[x] = find(father[x]);
		rank[x] = (rank[x]+rank[item])%3;
	}
	return father[x];
}
void Union(int x, int y)
{
		father[fx] = fy;
		rank[fx] = (3-rank[x]+d-1+rank[y])%3;
}
int main()
{
	int i = 0, n = 0, k = 0, sum = 0, x = 0, y = 0;
	scanf("%d %d",&n,&k);
	for(i = 0; i<=n; i++)
	{
		father[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++;
		else
		{
			fx = find(x); fy = find(y);
			if(fx == fy)
			{
				if((rank[x]+3-rank[y])%3 != d-1)
					sum++;
			}
			else
			{
				Union(x,y);
			}
		}
	}
	printf("%d\n",sum);
	return 0;
}




你可能感兴趣的:(POJ 1182 食物链)