团体程序设计天梯赛 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;
}
posted @ 2020-01-28 16:49  YuhanのBlog  阅读(500)  评论(0编辑  收藏  举报