题目:https://www.patest.cn/contests/gplt/L3-003
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
int fa[maxn],a[maxn];
vector<int> v;
set<int> ans;
int find(int x){
return fa[x]!=x?fa[x]=find(fa[x]):x;
}
void Union(int a,int b){
int x=find(a);
int y=find(b);
if(x==y)
return;
fa[x]=y;
}
bool cmp(int a,int b){
return a>b;
}
int main(){
int n,num=0;
cin>>n;
for(int i=0;i<1005;i++)
fa[i]=i;
for(int i=1;i<=n;i++){
int k,root;
cin>>k;
getchar();
cin>>root;
v.push_back(root);
for(int j=1;j<k;j++){
int tmp;
cin>>tmp;
Union(tmp,root);
}
}
for(int i=0;i<v.size();i++)
a[find(v[i])]++;
v.clear();
for(int i=0;i<1005;i++)
if(a[i]) v.push_back(a[i]);
sort(v.begin(),v.end(),cmp);
cout<<v.size()<<endl;
for(int i=0;i<v.size();i++)
if(i==0) cout<<v[i];
else cout<<" "<<v[i];
return 0;
}