PAT甲级 1107 Social Clusters (30分)(并查集)

题目描述:传送门

思路:题目中要求只要两个人有任意相同兴趣,那么他们就能被分到一组,于是可以记录每种兴趣对应的人(兴趣可以对应多个人,但是这里随便记录就行,只要有就可以之后进行合并了),之后遍历每个人的兴趣,根据兴趣对应的人合并即可,具体请参考代码。

代码:

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1005;

int ans[maxn];
int cnt[maxn];
int p[maxn];
vector <int> v[maxn];

int mfind(int u) {
	return p[u] == u ? u : p[u] = mfind(p[u]);
}

int main() {
	int n;
	scanf("%d" , &n);
	for(int i = 1 ; i <= n ; i++)p[i] = i;
	for(int i = 1 ; i <= n ; i++) {
		int t;
		scanf("%d:" , &t);
		while(t--) {
			int num;
			scanf("%d" , &num);
			cnt[num] = i;
			v[i].push_back(num);
		}
	}
    for(int i = 1 ; i <= n ; i++) {
		for(int j = 0 ; j < v[i].size() ; j++) {
			int x = cnt[v[i][j]]; x = mfind(x);
			int y = mfind(i);
			if(x != y) {
				p[x] = y;
				
			}
			
		}
	}
	int res = 0;
	for(int i = 1 ; i <= n ; i++) {
		int u = mfind(i);
		if(!ans[u])res++;
		ans[u]++;
	}
	sort(ans + 1 , ans + n + 1 );
	printf("%d\n" , res);
	for(int i = n ; i >= n - res + 1 ; i--) {
		if(i < n)printf(" ");
		printf("%d" , ans[i]);
	}
	printf("\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39475280/article/details/106336406