题目:
思路分析:
一个简单的并查集模版题吧!
代码实现:
/*
*@Author: GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
/*
* __----~~~~~~~~~~~------___
* . . ~~//====...... __--~ ~~
* -. \_|// |||\\ ~~~~~~::::... /~
* ___-==_ _-~o~ \/ ||| \\ _/~~-
* __---~~~.==~||\=_ -_--~/_-~|- |\\ \\ _/~
* _-~~ .=~ | \\-_ '-~7 /- / || \ /
* .~ .~ | \\ -_ / /- / || \ /
* / ____ / | \\ ~-_/ /|- _/ .|| \ /
* |~~ ~~|--~~~~--_ \ ~==-/ | \~--===~~ .\
* ' ~-| /| |-~\~~ __--~~
* |-~~-_/ | | ~\_ _-~ /\
* / \ \__ \/~ \__
* _--~ _/ | .-~~____--~-/ ~~==.
* ((->/~ '.|||' -_| ~~-/ , . _||
* -_ ~\ ~~---l__i__i__i--~~_/
* _-~-__ ~) \--______________--~~
* //.-~~~-~_--~- |-------~~~~~~~~
* //.-~~~--\
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* 神兽保佑 永无BUG
*/
const int MAX=1010;
int fa[MAX];
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void add(int x,int y){
int xx=find(x);
int yy=find(y);
if(xx==yy) return;
fa[xx]=yy;
}
bool cmp(int a,int b){
return a>b;
}
map<int,int>mp;
set<int>st;
int v[MAX];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=n;i++){
int k;
cin>>k;
getchar();
while (k--) {
int x;
cin>>x;
if(mp[x]==0) mp[x]=i;
else add(i,mp[x]);
}
}
for(int i=1;i<=n;i++){
int x=find(i);
if(st.count(x)==0) {
st.insert(x);
}
v[x]++;
}
cout<<st.size()<<endl;
sort(v,v+MAX,cmp);
for(int i=0;i<st.size();i++){
if(i==0) cout<<v[i];
else cout<<" "<<v[i];
}
}