1107 Social Clusters(二刷)

题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805361586847744

 1 #include<iostream>
 2 #include<vector>
 3 #include<map>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int father[1010],habby[1010];//表示喜欢habby的人的编号
 8 
 9 void init(int n) {
10     for(int i = 1; i <= n; ++i)
11         father[i] = i;
12 }
13 
14 int findfather(int a) {
15     int b = a;
16     while(a != father[a])
17         a = father[a];
18     while(b != father[b]) {
19         int t = b;
20         b = father[b];
21         father[t] = a;
22     }
23     return a;
24 }
25 
26 void Union(int a,int b) {
27     int fa = findfather(a);
28     int fb = findfather(b);
29     if(fa != fb)
30         father[fa] = fb;
31 }
32 bool cmp(pair<int,int> a,pair<int,int> b){
33     return a.second > b.second;
34 }
35 int main() {
36     int n,k,h;
37     cin>>n;
38     init(n);
39     for(int i = 1; i <= n; ++i) {
40         scanf("%d:",&k);
41         for(int j = 0; j < k; ++j) {
42             scanf("%d",&h);
43             if(habby[h] == 0)
44                 habby[h] = i;
45             Union(i,habby[h]);
46         }
47     }
48     map<int,int> ans;
49     for(int i = 1; i <= n; ++i)
50         ans[findfather(i)]++;
51     printf("%d\n",ans.size());
52     vector<pair<int,int>> v(ans.begin(),ans.end());
53     sort(v.begin(),v.end(),cmp);
54     for(int i = 0; i < v.size(); ++i) {
55         if(i != 0) printf(" ");
56         printf("%d",v[i].second);
57     }
58     return 0;
59 }

 

posted @ 2020-03-25 17:45  tangq123  阅读(131)  评论(0编辑  收藏  举报