1107. Social Clusters (30)

来源:互联网 发布:知乎日报网页版 编辑:程序博客网 时间:2024/06/07 19:23

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:
83: 2 7 101: 42: 5 31: 41: 31: 44: 6 8 1 51: 4
Sample Output:
34 3 1
#include <iostream>#include <algorithm>#include <cstdio>using namespace std;#define maxn 11000int father[maxn],course[maxn];int num[maxn];int findfather(int x){    return x == father[x] ? x:findfather(father[x]);}void join(int x, int y){    int dx = findfather(x);    int dy = findfather(y);    if(dx != dy)        father[dx] = dy;}int main(){    int n;    cin>>n;    for(int i = 1; i <= n; i++)    {        father[i] = i;    }    for(int i = 1; i <= n; i++)    {        int k,c;        scanf("%d:", &k);        for(int j  =0; j < k; j++)        {            scanf("%d", &c);            if(course[c] == 0)                course[c] = i;            join(i, findfather(course[c]));        }    }    for(int i = 1; i <= n; i++)    {        num[findfather(i)]++;    }    int cnt = 0;    for(int i = 1; i <= n; i++)    {        if(num[i] != 0)            cnt++;    }    sort(num, num+n+1);    cout<<cnt<<endl;;    int flag  = 0;    for(int i = n; i >= 0; i--)    {        if(num[i] != 0)        {            if(flag == 1)            {                cout<<" ";            }            flag = 1;            cout<<num[i];        }    }    return 0;}


原创粉丝点击