1. 程式人生 > 其它 >PTA社交叢集

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 }