版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr0cheng/article/details/79549523
并查集,先查找再合并
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000+10;
int father[maxn],cnt[maxn];
void init(){
for(int i=0;i<maxn;++i)father[i]=i; //n->maxn
}
int find(int x){
if(father[x]==x)return x;
father[x]=find(father[x]);
return father[x];
}
int main(){
int n,k,t,rtx,rty;
scanf("%d",&n);
init();
for(int i=0;i<n;++i){
scanf("%d: ",&k);
for(int j=0;j<k;++j){
scanf("%d",&t);
if(j==0){
rtx = find(t);
}else{
rty = find(t);
if(rtx!=rty){
father[rty]=rtx;
cnt[rtx]+=cnt[rty];
}
}
}
++cnt[rtx];
}
vector<int> ans;
for(int i=1;i<maxn;++i){ //n->maxn
if(father[i]==i && cnt[i]!=0){
ans.push_back(cnt[i]);
}
}
sort(ans.begin(),ans.end());
printf("%d\n",ans.size());
for(vector<int>::reverse_iterator it = ans.rbegin();it!=ans.rend();++it){
if(it==ans.rbegin())printf("%d",*it);
else printf(" %d",*it);
}
return 0;
}