• PAT1107:Social Clusters


    1107. Social Clusters (30)

    时间限制
    1000 ms
    内存限制
    65536 kB
    代码长度限制
    16000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    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:

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

    where Ki (>0) is the number of hobbies, and hi[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


    思路
    并查集问题,course数组保存最先选择该课程的,source保存每个人关联的源点,然后查找合并就行。
    代码
    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<iomanip>
    using namespace std;
    vector<int> source(1001,0);
    vector<int> course(1001,0);
    
    int  findSource(int a)
    {
        int t = a;
        while(source[a] != a)
        {
            a = source[a];
        }
        while(source[t] != t)
        {
            int tmp = t;
            t = source[t];
            source[tmp] = a;
        }
        return a;
    }
    
    void Union(int a,int b)
    {
        a = findSource(a);
        b = findSource(b);
        if( a != b)
            source[a] = b;
    }
    
    bool cmp(int a,int b)
    {
        return a > b;
    }
    
    int main()
    {
       int N;
       while(cin >> N)
       {
           vector<int> root(N + 1,0);
           for(int i = 1;i <= N;i++)
           {
               source[i] = i;
           }
           for(int i = 1;i <= N;i++)
           {
               int k;
               scanf("%d : ",&k);
               for(int j = 1;j <= k;j++)
               {
                   int h;
                   cin >> h;
                   if(course[h] == 0)
                     course[h] = i;
                   Union(i,findSource(course[h]));
               }
           }
           for(int i = 1;i <= N;i++)
           {
               ++root[findSource(i)];
           }
           int cnt = 0;
           for(int i = 1;i <= N;i++)
           {
               if(root[i] > 0)
                cnt++;
           }
           cout << cnt << endl;
           int flag = 0;
           sort(root.begin(),root.end(),cmp);
    
           for(int i = 0;i < cnt;i++)
           {
              if(flag++ != 0)
                cout << " ";
              cout << root[i];
           }
    
       }
    }
    

      

  • 相关阅读:
    实验:缓冲区溢出
    树莓派4B安装和使用openEuler系统
    stat命令的实现-mysate
    20191310Lee_Yellow第五章读书笔记
    反汇编测试
    openssl编程
    Openeuler安装完整man手册
    20191310Lee_yellow缓冲区溢出实验
    《奔跑吧!树莓派》实验指导第三章
    20191310李烨龙第四章读书笔记
  • 原文地址:https://www.cnblogs.com/0kk470/p/8004861.html
Copyright © 2020-2023  润新知