分析:PAT之日常并查集。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n, father[1010], seq[1010], res[1010];
int cmp(int a, int b){
return a > b;
}
void init(){
for(int i = 0; i<1010; i++){
father[i] = i;
}
}
int getF(int x){
return x == father[x] ? x : father[x] = getF(father[x]);
}
void merge(int a, int b){
int fa = getF(a), fb = getF(b);
if(fa != fb) father[fa] = fb;
}
int main(){
//freopen("aa.txt", "r", stdin);
init();
scanf("%d", &n);
int num, tem, first, cnt = 0;
for(int i = 0; i<n; i++){
scanf("%d: %d", &num, &first);
seq[i] = first;
for(int j = 1; j<num; j++){
scanf("%d", &tem);
merge(first, tem);
}
}
for(int i = 0; i<n; i++){
int fa = getF(seq[i]);
if(!res[fa]){
cnt++;
}
res[fa]++;
}
sort(res, res+1010, cmp);
cout << cnt << '\n';
for(int i = 0; i<cnt; i++){
cout << res[i];
i != cnt-1 ? cout << " " : cout << '\n';
}
return 0;
}