1118. Birds in Forest (25)

#include <iostream>
#include <vector>

using namespace std;

int flag[10010], sum[10010], tree[10010];
vector<int> v;

void init(int id)
{
	tree[id] = -1;
	sum[id] = 1;
	flag[id] = 1;

	v.push_back(id);
}

int findroot(int root)
{
	if(tree[root] == -1)
	{
		return root;
	}
	else
	{
		tree[root] = findroot(tree[root]);
		return tree[root];
	}
}

void buildrelation(int index[2])
{
	int i;
	for(i = 0; i <= 1; i++)
	{
		if(flag[index[i]] == 0)
		{
			init(index[i]);
		}
		else
		{
			index[i] = findroot(index[i]);
		}
	}

	if(index[0] == index[1])
	{
		return;
	}

	int index0 = index[0], index1 = index[1];
	if(sum[index1] > sum[index0])
	{
		index0 = index[1];
		index1 = index[0];
	}

	tree[index1] = index0;
	sum[index0] += sum[index1];
}

int getrootcount()
{
	int i, size = v.size(), count = 0;
	for(i = 0; i < size; i++)
	{
		if(tree[v[i]] == -1)
		{
			count++;
		}
	}

	return count;
}

int main()
{
	int n;
	scanf("%d", &n);

	int i, k, first, j, next, index[2];
	for(i = 1; i <= n; i++)
	{
		scanf("%d%d", &k, &first);
		index[0] = first;

		for(j = 1; j < k; j++)
		{
			scanf("%d", &next);
			index[1] = next;

			buildrelation(index);
		}

		if(k == 1)
		{
			init(first);
		}
	}

	printf("%d %d\n", getrootcount(), v.size());

	int q;
	scanf("%d", &q);

	int a, b;
	for(i = 1; i <= q; i++)
	{
		scanf("%d%d", &a, &b);

		a = findroot(a);
		b = findroot(b);

		if(a == b)
		{
			printf("Yes\n");
		}
		else
		{
			printf("No\n");
		}
	}

	system("pause");
	return 0;
}

 

posted on 2025-11-25 09:06  王景迁  阅读(4)  评论(0)    收藏  举报

导航