#include<stdio.h>
#include<algorithm>
using namespace std;
#define MAX_N 1100
int set[MAX_N];
int n;
int course[MAX_N];
int root[MAX_N];
int find(int x){
int r=x;
while(set[r]!=r){
r=set[r];
}
return r;
}
int merge(int x,int y){
int fx,fy;
fx=find(x);
fy=find(y);
if(fx==fy) return 0;
else{
set[fx]=fy;
}
}
void init(){
for(int i=1;i<=n;i++){
set[i]=i;
}
}
bool cmp(int a,int b){
return a>b;
}
int main(){
scanf("%d",&n);
init();
int count=0;
int k;
for(int i=1;i<=n;i++){
scanf("%d:",&k);
int h;
for(int j=0;j<k;j++){
scanf("%d",&h);
if(course[h]==0)
course[h]=i;
merge(i,find(course[h]));
}
}
for(int i=1;i<=n;i++){
root[find(i)]++;
}
for(int i=1;i<=n;i++){
if(root[i]!=0)
count++;
}
printf("%d\n",count);
sort(root+1,root+n+1,cmp);
for(int i=1;i<=count;i++){
printf("%d",root[i]);
if(i!=count)
printf(" ");
}
}
1107. Social Clusters (30) PAT甲级
最新推荐文章于 2018-01-29 16:23:45 发布
本文深入探讨了并查集算法的实现原理与应用,通过一个具体的程序实例详细讲解了如何利用并查集解决集合合并的问题。文章首先介绍了并查集的基本概念,接着展示了其在程序中的具体实现方式,并通过一个完整的C语言程序示例来说明如何进行集合的查找与合并操作。
847

被折叠的 条评论
为什么被折叠?



