题目描述
C++代码
样例
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<set>
using namespace std;
const int N = 1e3 + 10;
vector<int> hobby[N];
int parent[N];
int cnt[N];
int find(int x)
{
if(x!=parent[x])
{
parent[x]=find(parent[x]);
}
return parent[x];
}
int main()
{
int n;
cin >> n;
for(int i=1;i<=n;i++)
{
parent[i]=i;
}
for (int i=1;i<=n;i++)
{
int m;
cin >> m;
getchar();
while (m--)
{
int x;
cin >> x;
hobby[x].push_back(i);
}
}
for(int i=1;i<=1000;i++)
{
for(int j=1;j<hobby[i].size();j++)
{
int a=find(hobby[i][0]);
int b=find(hobby[i][j]);
if(a!=b)
{
parent[b]=a;
}
}
}
int sum=0;
for(int i=1;i<=n;i++)
{
if(!cnt[find(i)])
{
sum++;
}
cnt[find(i)]++;
}
sort(cnt+1,cnt+1+n,[](int& a,int& b){
return a>b;
});
cout << sum << endl;
cout << cnt[1];
for(int i=2;i<=sum;i++)
{
cout << " " << cnt[i];
}
return 0;
}