poj 1611 The Suspects

#include<stdio.h>
#include<string.h>

int pre[30000],num[30000],a[30000];

int find(int x)
{
	int r = x;
	while(r != pre[r])
		r = pre[r];
	int i = x,j;
	while(i != r)
	{
		j = pre[i];
		pre[i] = r;
		i = j;
	}
	return r;
}

void join(int a,int b)
{
	int r_a = find(a);
	int r_b = find(b);
	if(r_a != r_b)
		{
			pre[r_a] = r_b;
			num[r_b] += num[r_a];
		}
}

int main()
{
	int n,m,k;
	while(~scanf("%d%d",&n,&m))
	{
		memset(pre,0,sizeof(pre));
		memset(num,0,sizeof(num));
		if(m == 0 && n == 0)
			break;
		for(int i = 0;i < n;i++)
		{
			pre[i] = i;
			num[i] = 1;
		}
		while(m--)
		{
			int k;
			scanf("%d",&k);
			scanf("%d",&a[0]);
			for(int i = 1;i < k;i++)
				{
					scanf("%d",&a[i]);
					join(a[i-1],a[i]);
				}
		}
		printf("%d\n",num[find(0)]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/feynmanz/article/details/80273472