#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1010;
int father[maxn];
int isroot[maxn];
int course[maxn] = { 0 };
int findfather(int x)
{
int a = x;
while (x != father[x])
{
x = father[x];
}
while (a != father[a])//路径压缩,把所有路径上的点的父节点全都统一
{
int z = a;
a = father[a];
father[z] = x;
}
return x;
}
void Union(int a, int b)//这里是把a合并到b所在的集合中去
{
int fa = findfather(a);
int fb = findfather(b);
if (fa != fb) father[fa] = fb;
}
void init(int n)//注意这里是从1开始,以下所有的都要从1开始
{
for (int i = 1; i <= n; i++)
{
father[i] = i;
isroot[i] = 0;
}
}
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
int n, num, temp;
scanf("%d", &n);
init(n);
for (int i = 1; i <= n; i++)
{
scanf("%d:", &num);
for (int j = 0; j < num; j++)
{
scanf("%d", &temp);
if (course[temp] == 0) course[temp] = i;
Union(i, findfather(course[temp]));//将i合并到已有的union中去
}
}
for (int i = 1; i <= n; i++)
{
isroot[findfather(i)]++;
}
int total=0;
for (int i = 1; i <= n; i++)
{
if (isroot[i] != 0) total++;
}
printf("%d\n", total);
sort(isroot + 1, isroot + n + 1, cmp);
for (int i = 1; i <= total; i++)
{
printf("%d", isroot[i]);
if (i != total) printf(" ");
}
return 0;
}
1107 Social Clusters (30 分)并查集
最新推荐文章于 2020-03-23 17:22:00 发布