zoukankan      html  css  js  c++  java
  • 社交集群

    L3-1 社交集群 (30 分)

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

    输入格式:

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

    Ki​​: hi​​[1hi​​[2] ... hi​​[Ki​​]

    其中Ki​​(>0)是兴趣爱好的个数,hi​​[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
    

    输出样例:

    3
    4 3 1
    
     
    作者: 陈越
    单位: 浙江大学
    时间限制: 3000 ms
    内存限制: 64 MB
    代码长度限制: 16 KB
    #include <bits/stdc++.h>
    
    using namespace std;
    const int maxn=1e5+6;
    int vis[maxn],n,k,tmp,tot,p[maxn],fa[maxn];
    char c;
    int fd(int o){
         return o==fa[o]?o:fa[o]=fd(fa[o]);
    }
    void mg(int a,int b){
         int u=fd(a),v=fd(b);
         if(u!=v)fa[u]=v;
    }
    bool comp(int a,int b){return a>b;}
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)fa[i]=i;
        for(int i=1;i<=n;i++){
            cin>>k>>c;
            for(int j=1;j<=k;j++){
                cin>>tmp;
                if(vis[tmp])mg(vis[tmp],i);
                else vis[tmp]=i;
            }
        }
        for(int i=1;i<=n;i++){
            if(i==fa[i])tot++;
            p[fd(i)]++;
        }
        sort(p+1,p+1+n,comp);
        cout<<tot<<endl;
        for(int i=1;i<=tot;i++){
            if(i!=1)cout<<' ';
            cout<<p[i];
        }
        return 0;
    }
  • 相关阅读:
    第四篇博客
    第三篇博客
    第二篇博客
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
    C博客作业05--指针
    C博客作业04-数组
    C语言博客作业03--函数
    C语言博客作业02--循环结构
  • 原文地址:https://www.cnblogs.com/czy-power/p/10547143.html
Copyright © 2011-2022 走看看