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


    并查集。将兴趣有交集的人合并在一组,可以考虑使用vector数组。一般思路会想到将人的编号作下标然后两两枚举寻找相同兴趣。超时,,那么反过来想,以兴趣作下标将每种兴趣的人存到一起,然后就可以依次合并了,这样时间将会优化很多。
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<vector>
    #include<algorithm>
    #define MAX 1005
    using namespace std;
    
    int f[MAX],b[MAX];
    vector<int> v[MAX];
    vector<int> vv;
    int find(int x){
        return f[x]==x?x:f[x]=find(f[x]);
    }
    int main()
    {
        int n,x,i,j,k;
        scanf("%d",&n);
        for(i=1;i<=n;i++){
            f[i]=i;
        }
        for(i=1;i<=n;i++){
            scanf("%d:",&k);
            for(j=1;j<=k;j++){
                scanf("%d",&x);
                v[x].push_back(i);
            }
        }
        for(i=1;i<=1000;i++){
            if(v[i].size()>1){
                int fx=find(v[i][0]);
                for(j=1;j<v[i].size();j++){
                    int fy=find(v[i][j]);
                    if(fx!=fy){
                        f[fy]=fx;
                    }
                }
            }
        }
        for(i=1;i<=n;i++){
            b[find(i)]++;
        }
        for(i=1;i<=n;i++){
            if(b[i]>0){
                vv.push_back(b[i]);
            }
        }
        sort(vv.begin(),vv.end());
        printf("%d
    ",vv.size());
        for(i=vv.size()-1;i>=0;i--){
            if(i==vv.size()-1) printf("%d",vv[i]);
            else printf(" %d",vv[i]);
        }
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    Python网络编程(weekly summary1)
    Python网络编程(子进程的创建与处理、简单群聊工具)
    Python网络编程(epoll内核监听,多任务多进程)
    Python网络编程(http协议,IO多路复用、select内核监听)
    Python网络编程(socket模块、缓冲区、http协议)
    Python网络编程(OSI模型、网络协议、TCP)
    Linux(Ubuntu 命令大全)
    计算机中的进制和编码
    算法图解(选择排序)
    Python全栈 MySQL 数据库(SQL命令大全、MySQL 、Python调用)
  • 原文地址:https://www.cnblogs.com/yzm10/p/8678466.html
Copyright © 2011-2022 走看看