时间限制
1000 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
在社交网络平台注册时,用户通常会输入自己的兴趣爱好,以便找到和自己兴趣相投的朋友。有部分兴趣相同的人们就形成了“社交集群”。现请你编写程序,找出所有的集群。

输入格式:

输入的第一行给出正整数N(<=1000),即社交网络中的用户总数(则用户从1到N编号)。随后N行,每行按下列格式列出每个人的兴趣爱好:

Ki: hi[1] hi[2] … hi[Ki]

其中Ki(>0)是第i个人的兴趣的数量,hi[j]是第i个人的第j项兴趣的编号,编号范围为[1, 1000]内的整数。

输出格式:

首先在第一行输出整个网络中集群的数量,然后在第二行按非递增的顺序输出每个集群中用户的数量。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:
8
3: 2 7 10
1: 4
2: 5 3
1: 4
1: 3
1: 4
4: 6 8 1 5
1: 4
输出样例:
3
4 3 1

分析:
题意就是要找有多少个团体,按团体的人数非递增输出
容易想到的是并查集来做。 有相同爱好的就合并,然后查找每个人的第一个兴趣的根,计数,排序,输出

#include <bits/stdc++.h>
using namespace std;

#define mem(a,n) memset(a,n,sizeof(a))
#define memc(a,b) memcpy(a,b,sizeof(b))
#define rep(i,a,n) for(int i=a;i<n;i++) ///[a,n)
#define dec(i,n,a) for(int i=n;i>=a;i--)///[n,a]
#define pb push_back
#define fi first
#define se second
#define IO ios::sync_with_stdio(false)
#define fre freopen("in.txt","r",stdin)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
typedef unsigned long long ull;
const double PI=acos(-1.0);
const double E=2.718281828459045;
const double eps=1e-3;
const int INF=0x3f3f3f3f;
const int MOD=1e8+7;
const int N=1e3+5;
const ll maxn=1e6+5;
const int dir[4][2]= {-1,0,1,0,0,-1,0,1};

bool vis[N];
int par[N];
int par_num[N];
vector<int>g[N];
int Find(int x)
{
    return par[x]==x?x:(par[x]=Find(par[x]));
}
bool unite(int u,int v)
{
    int fau=Find(u);
    int fav=Find(v);
    if(fau!=fav)
    {
        par[fav]=fau;
        return true;
    }
    return false;
}
void init()
{
    for(int i=1; i<=1000; i++)
    {
        par[i]=i;
        vis[i]=0;
        par_num[i]=0;
    }
}
int a[N];
int main()
{
    int n;
    init();
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        int k,u,v;
        scanf("%d:%d",&k,&u);
        a[i]=u;
        while(--k)
        {
            scanf("%d",&v);
            unite(u,v);
        }
    }
    for(int i=1;i<=n;i++)
    {
        int pa=Find(a[i]);
        par_num[pa]++;
    }
    vector<int>vec;
    int ans=0;
    for(int i=1; i<=1000; i++)
    {
        if(par_num[i])
        {
            ans++;
            vec.pb(par_num[i]);
        }
    }
    printf("%d\n",ans);
    sort(vec.begin(),vec.end(),greater<int>());
    bool flag=1;
    for(auto x:vec)
    {
        if(flag) flag=0,printf("%d",x);
        else printf(" %d",x);
    }
    puts("");
    return 0;
}