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;
    }
  • 相关阅读:
    rsync备份服务器搭建学习笔记
    switch case
    常见http状态码
    正则去除html字符串中的注释、标签、属性
    2018-10-10 10:00 从今日开始记录
    Qt dialog 的geometry()
    Qt禁止最大和最小化
    tableWidget删除除了头外的内容并释放
    Qt QTabBar 实现宽度调整,非QSS
    Qt 歌词有关内容
  • 原文地址:https://www.cnblogs.com/yzm10/p/8678466.html
Copyright © 2011-2022 走看看