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 }
本文来自博客园,作者:{scanner},转载请注明原文链接:{https://home.cnblogs.com/u/scannerkk/}

浙公网安备 33010602011771号