PAT 1107 Social Clusters

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 (≤), 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​​ (>) is the number of hobbies, and [ 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


 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5 vector<int> parent(1001), _count(1001), vis(1001, false);
 6 int find(int x){
 7   int y=x, z;
 8   while(x!=parent[x]) x=parent[x];
 9   while(y!=x){
10     z=parent[y];
11     parent[y]=x;
12     y=z;
13   }
14   return x;
15 }
16  
17 bool _union(int a, int b){
18   int roota=find(a), rootb=find(b);
19   if(roota==rootb) return false;
20   else{
21       if(_count[roota]>_count[rootb]) {
22           parent[rootb]=roota;
23           _count[roota] += _count[rootb];
24       }else{
25           parent[roota]=rootb;
26           _count[rootb] += _count[roota];
27       }
28     return true;
29   }
30 }
31 //并查集解决这道题 很简单 用一个数组来记录根节点 用一个数组来记录每棵树的的人数  
32 //这一题的测试数据比较少  不压缩路径也没有关系
33 int main(){
34   int n, i;
35   scanf("%d", &n);
36   fill(_count.begin(), _count.end(), 0);
37   for(i=1; i<=1000; i++) parent[i]=i;//开始条件为i<1000有四个测试点不能通过  修改成i<=1000就能全部通过了
38   for(i=0; i<n; i++){
39     int cnt, j, temp, hobby;
40     scanf("%d: %d", &cnt, &temp);
41     _count[find(temp)]++;
42     vis[temp]=true;
43     for(j=1; j<cnt; j++){
44       scanf("%d", &hobby);
45       _union(temp, hobby);
46       temp=hobby;
47       vis[temp]=true;
48     }
49   }
50   vector<int> ans;
51   for(i=1; i<=1000; i++)
52     if(parent[i]==i && vis[i]) ans.push_back(_count[i]);
53   sort(ans.begin(), ans.end());
54   printf("%d\n", ans.size());
55   printf("%d", ans[ans.size()-1]);
56   for(i=ans.size()-2; i>=0; i--) printf(" %d", ans[i]); 
57   return 0;
58 }

 

posted @ 2018-09-04 17:03  赖兴宇  阅读(449)  评论(0编辑  收藏  举报