并查集
#include <iostream>
#include <vector>
#include <set>
#include <stdio.h>
#include <algorithm>
using namespace std;
int num;
int cluster[1001]= {0};
int ans[1001]= {0};
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
//freopen("D:/test.txt","r",stdin);
cin>>num;
int i=num;
vector< set<int> > social;
while(i--)
{
set<int> hobby;
int a=0;
cin>>a;
char c;
cin>>c;
while(a--)
{
int b;
cin>>b;
hobby.insert(b);
}
social.push_back(hobby);
}
for(i=1; i<num; i++)
{
bool flag=0;
bool jump=0;
int temp=0;
for(int m=0; m<i; m++)
{
if(cluster[m+1]==0)
{
for(set<int>::iterator it=social[i].begin(); it!=social[i].end(); it++)
{
for(set<int>::iterator im=social[m].begin(); im!=social[m].end(); im++)
{
if(*it==*im)
{
if(flag==1)
{
for(set<int>::iterator it2=social[m].begin(); it2!=social[m].end(); it2++)
{
social[temp].insert(*it2);
}
cluster[m+1]=temp+1;
}
else
{
flag=1;
temp=m;
cluster[i+1]=m+1;
for(set<int>::iterator it2=social[i].begin(); it2!=social[i].end(); it2++)
{
social[m].insert(*it2);
}
}
jump=1;
break;
}
}
if(jump)
{
break;
}
}
}
jump=0;
}
}
int cnt=0;
vector<int> nv;
for(i=1; i<=num; i++)
{
if(cluster[i]==0)
{
cnt++;
ans[i]++;
}
else
{
int p=cluster[i];
while(cluster[p])
p=cluster[p];
ans[p]++;
}
}
for(i=1; i<=num; i++)
{
if(ans[i]!=0){
nv.push_back(ans[i]);
}
}
sort(nv.begin(),nv.end(),cmp);
cout<<cnt<<endl;
cout<<nv[0];
for(i=1; i<nv.size(); i++)
{
cout<<" "<<nv[i];
}
return 0;
}