1107. Social Clusters (30)

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int tree[1010], sum[1010];
vector<int> v[1010];

int cmp(int a, int b)
{
	return a > b;
}

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

int judge(int index[2])
{
	int begin[2], size[2], i;
	for(i = 0; i <= 1; i++)
	{
		size[i] = v[index[i]].size();
		begin[i] = 0;
	}

	int j, h[2];
	for(i = 0, j = 0; i < size[0] && j < size[1]; )
	{
		h[0] = v[index[0]][i];
		h[1] = v[index[1]][j];

		if(h[0] == h[1])
		{
			return 1;
		}
		else if(h[0] > h[1])
		{
			j++;
		}
		else
		{
			i++;
		}
	}

	return 0;
}

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

	int i, j, k, hobby;
	for(i = 1; i <= n; i++)
	{
		scanf("%d:", &k);

		for(j = 1; j <= k; j++)
		{
			scanf("%d", &hobby);
			v[i].push_back(hobby);
		}

		tree[i] = -1;
		sum[i] = 1; 

		sort(v[i].begin(), v[i].end());
	}

	int index[2];
	for(i = 1; i <= n; i++)
	{
		for(j = 1; j <= n; j++)
		{
			if(i == j)
			{
				continue;
			}

			index[0] = i;
			index[1] = j;

			if(judge(index) == 0)
			{
				continue;
			}

			index[0] = findroot(index[0]);
			index[1] = findroot(index[1]);

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

			if(sum[index[0]] >= sum[index[1]])
			{
				tree[index[1]] = index[0];
				sum[index[0]] += sum[index[1]];
			}
			else
			{
				tree[index[0]] = index[1];
				sum[index[1]] += sum[index[0]];
			}
		}
	}

	vector<int> res;
	for(i = 1; i <= n; i++)
	{
		if(tree[i] == -1)
		{
			res.push_back(sum[i]);
		}
	}

	sort(res.begin(), res.end(), cmp);

	int size = res.size();
	printf("%d\n", size);

	for(i = 0; i < size; i++)
	{
		if(i > 0)
		{
			printf(" ");
		}

		printf("%d", res[i]);
	}

	printf("\n");

	system("pause");
	return 0;
}

 

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

导航