• 1107 Social Clusters (30)


    When register on a social network, you are always asked to specify your hobbies in order to find some potential friends with the same hobbies. A "social cluster" is a set of people who have some of their hobbies in common. You are supposed to find all the clusters.

    Input Specification:

    Each input file contains one test case. For each test case, the first line contains a positive integer N (<=1000), the total number of people in a social network. Hence the people are numbered from 1 to N. Then N lines follow, each gives the hobby list of a person in the format:

    K~i~: h~i~[1] h~i~[2] ... h~i~[K~i~]

    where K~i~ (>0) is the number of hobbies, and h~i~[j] is the index of the j-th hobby, which is an integer in [1, 1000].

    Output Specification:

    For each case, print in one line the total number of clusters in the network. Then in the second line, print the numbers of people in the clusters in non-increasing order. The numbers must be separated by exactly one space, and there must be no extra space at the end of the line.

    Sample Input:

    8
    3: 2 7 10
    1: 4
    2: 5 3
    1: 4
    1: 3
    1: 4
    4: 6 8 1 5
    1: 4
    

    Sample Output:

    3
    4 3 1
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn = 1010;
    int course[maxn] = {0};
    int father[maxn];
    int isRoot[maxn] = {0};
    
    int findFather(int x){
        int a = x;
        while(x != father[x]){
            x = father[x];
        }
        while(a != father[a]){
            int z = a;
            a = father[a];
            father[z] = x;
        }
        return x;
    }
    
    
    void Union(int a,int b){
        int faA = findFather(a);
        int faB = findFather(b);
        if(faA != faB) father[faA] = faB;
           
    }
    
    void init(int n){
        for(int i = 1; i <= n; i++){
            father[i] = i;
        }
        
    }
    
    bool cmp(int a,int b){
        return a > b;
    }
    
    int main(){
        
        int n,k,h;
        scanf("%d",&n);
        init(n);
        for(int i = 1; i <= n; i++){
            scanf("%d:",&k);
            for(int j = 0; j < k; j++){
                scanf("%d",&h);
                if(course[h] == 0){
                    course[h] = i;
                }
                Union(i,findFather(course[h]));   //将course[h] == i号人归类 
            }
        }
        for(int i = 1; i <= n; i++){
            isRoot[findFather(i)]++;  //i的根节点的个数为社交圈的个数 
        }
        int ans = 0;
        for(int i = 1; i <= n; i++){
            if(isRoot[i] != 0) ans++;
        }
        printf("%d
    ",ans);
        sort(isRoot+1,isRoot+n+1,cmp);
        for(int i = 1; i <= ans; i++){
            printf("%d",isRoot[i]);
            if(i < ans)printf(" ");
        }
        return 0;
    }
  • 相关阅读:
    JavaScript观察者模式
    JavaScript装饰者模式
    使用uni-app开发小程序,关于小程序更新后与用户本地不会及时更新解决办法
    6.3 基于二分搜索树、链表的实现的集合Set复杂度分析
    解决uni-app props 传递数组修改后不能使用问题
    6.2 集合和映射--集合Set->底层基于链表实现
    6.1 集合和映射--集合Set->底层基于二叉搜索树实现
    【刷题记录
    【codeforces
    【loj
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/9312893.html
Copyright © 2020-2023  润新知