并查集
注意合并的时候是合并根,不是当前点
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <string>
#include <cctype>
#include <vector>
#include <cstring>
#include <map>
using namespace std;
int n;
int fa[1100];
int ans[1100];
int ch[1100];
int find(int r){
return fa[r] == r?r:fa[r]=find(fa[r]);
}
void join (int x,int y){
int a = find(x);
int b = find(y);
if(a!=b) fa[b] = a;
}
bool my(int a,int b){
return a>b;
}
int main()
{
cin >> n;
for(int i=0; i<1100; i++)
fa[i] = i;
for(int i=1; i<=n; i++){
int k;
scanf("%d:",&k);
for(int j=0; j<k; j++){
int m;
cin >> m;
if(ch[m]==0){
ch[m] = i;
}
else join(ch[m],i);
}
}
for(int i=1; i<=n; i++){
ans[find(i)]++;
}
int sum = 0;
for(int i=1; i<=n; i++){
if(ans[i]!=0) sum++;
}
cout << sum << endl;
sort(ans,ans+n+1,my);
for(int i=0; i<sum; i++){
if(i==0) cout << ans[i];
else cout << " " << ans[i];
}
return 0;
}