PTA社交集群

一、题目描述

 

 二、解题思路

  这个题难的点在于阅读理解,导致我比赛的时候知道他是个并查集,但是没有写出来。这里我们并不是把人数合并,而是把爱好合并,最后遍历爱好就可以找到答案了。

三、代码实现

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 map <int,int> ans;
 4 int a[1020];
 5 int vis[1020];
 6 int find(int u)
 7 {
 8     return u==a[u] ? u : a[u] = find(a[u]);
 9 }
10 bool cmp(int p,int k)
11 {
12     return p > k;
13 }
14 const int limit = 1e3 + 10;
15 int main()
16 {
17     int n;
18     cin >> n;
19     for(int i = 1;i <= limit;i++)
20         a[i] = i;
21     for(int i = 1;i <= n;i++){
22         int num;
23         scanf("%d:",&num);
24         int id;
25         cin >> id;
26         id = find(id);
27         vis[id]++;
28         for(int j = 1;j < num;j++){
29             int id2;
30             cin >> id2;
31             id2 = find(id2);
32             a[id2] = id;
33             vis[id] += vis[id2];
34             vis[id2] = 0;
35         }
36     }
37     vector <int> ans2;
38     for(int i = 1;i <= limit;i++)
39         if(vis[i])
40             ans2.push_back(vis[i]);
41     sort(ans2.begin(),ans2.end(),cmp);
42     int j = 1;
43     cout << ans2.size() << endl;
44     for(auto u:ans2){
45         if(j != ans2.size())
46             cout << u << ' ';
47         else
48             cout << u;
49         j++;
50     }
51     return 0;
52 }
posted @ 2022-03-15 15:16  scannerkk  阅读(78)  评论(0)    收藏  举报