• 1107 Social Clusters (30)(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 <stdio.h>
    #include <stdlib.h>
    int n,m,d,c,f[1001],mp[1001][1001],num[1001],ans[1001];
    void init() {
        for(int i = 1;i <= n;i ++) {
            f[i] = i;
        }
    }
    int getf(int x) {
        if(x != f[x])f[x] = getf(f[x]);
        return f[x];
    }
    void mer_(int x,int y) {
        int xx = getf(x),yy = getf(y);
        f[xx] = yy;
    }
    int cmp(const void *a,const void *b) {
        return *(int *)b - *(int *)a;
    }
    int main() {
        scanf("%d",&n);
        init();
        for(int i = 1;i <= n;i ++) {
            scanf("%d:",&m);
            for(int j = 1;j <= m;j ++) {
                scanf("%d",&d);
                mp[i][d] = 1;
                for(int k = 1;k < i;k ++) {
                    if(mp[k][d])mer_(k,i);
                }
            }
        }
        for(int i = 1;i <= n;i ++) {
            int e = getf(i);
            num[e] ++;
        }
        for(int i = 1;i <= n;i ++) {
            if(num[i])ans[c ++] = num[i];
        }
        qsort(ans,c,sizeof(int),cmp);
        printf("%d
    ",c);
        for(int i = 0;i < c;i ++) {
            if(i)putchar(' ');
            printf("%d",ans[i]);
        }
    }
  • 相关阅读:
    【tomcat8】consider increasing the maximum size of the cache
    *更新*无需root,一条命令强制全屏模式
    处理SFTP服务器上已离职用户,设置为登录禁用状态
    一个Web 持续集成工作实践
    tensorflow实战笔记(18)----textCNN
    train loss相关问题
    Spark学习(4)----ScalaTest
    scala学习(4)---Array定长数组操作
    spark学习(3)---集合
    spark学习(2)---RDD
  • 原文地址:https://www.cnblogs.com/8023spz/p/9279804.html
Copyright © 2020-2023  润新知