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