PTA 社交集群 (30 分)

版权声明:请移步http://www.cnblogs.com/BobHuang/ https://blog.csdn.net/Bob__Huang/article/details/88170729

当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友。一个“社交集群”是指部分兴趣爱好相同的人的集合。你需要找出所有的社交集群。

输入格式:
输入在第一行给出一个正整数 N(≤1000),为社交网络平台注册的所有用户的人数。于是这些人从 1 到 N 编号。随后 N 行,每行按以下格式给出一个人的兴趣爱好列表:

K
​i
​​ : h
​i
​​ [1] h
​i
​​ [2] … h
​i
​​ [K
​i
​​ ]

其中K
​i
​​ (>0)是兴趣爱好的个数,h
​i
​​ [j]是第j个兴趣爱好的编号,为区间 [1, 1000] 内的整数。

输出格式:
首先在一行中输出不同的社交集群的个数。随后第二行按非增序输出每个集群中的人数。数字间以一个空格分隔,行末不得有多余空格。

输入样例:
8
3: 2 7 10
1: 4
2: 5 3
1: 4
1: 3
1: 4
4: 6 8 1 5
1: 4
并查集之后排序就好了

#include <bits/stdc++.h>
using namespace std;
const int N=1005;
int fa[N],a[N],num[N];
int Find(int x)
{
    return x==fa[x]?x:fa[x]=Find(fa[x]);
}
int Union(int a,int b)
{
    a=Find(a),b=Find(b),fa[a]=b;
    return a!=b;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0; i<N; i++)fa[i]=i;
    for(int i=0,x,y; i<n; i++)
    {
        scanf("%d: %d",&x,&y),a[i]=y;
        for(int j=1,z; j<x; j++)cin>>z,Union(y,z);
    }
    int cnt=0;
    for(int i=0; i<n; i++)num[Find(a[i])]++;
    for(int i=0; i<N; i++)if(num[i])cnt++;
    sort(num,num+N,greater<int>());
    printf("%d\n",cnt);
    printf("%d", num[0]);
    for(int i=1; i<cnt; i++)printf(" %d", num[i]);
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Bob__Huang/article/details/88170729