团体程序设计天梯赛 L3-003 社交集群 (30分)(并查集)
题目链接:
L3-003 社交集群 (30分)
思路:
对于每个爱好我们存一个代表人物进去,然后遇到其它有这个爱好的人就使用并查集将它们合并起来;
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int n, par[maxn], a[maxn];
inline void init_set() { for(int i = 1; i < maxn; i++) par[i] = i; }
inline int find(int a) {
if(a == par[a]) return a;
return par[a] = find(par[a]);
}
inline void unite(int a, int b) { par[find(a)] = find(b); }
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
init_set();
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
int k, h;
for(scanf("%d:", &k); k--;) {
scanf("%d", &h);
if(a[h]) unite(i, a[h]);
else a[h] = i;
}
}
map<int, int> cnt;
for(int i = 1; i <= n; i++) ++cnt[find(i)];
vector<int> v;
for(auto & x : cnt) v.push_back(x.second);
sort(v.begin(), v.end(), greater<int>());
cout << v.size() << '\n' << v[0];
for(int i = 1; i < v.size(); i++) cout << ' ' << v[i];
return 0;
}