1107. Social Clusters (30)解题报告

使用并查集和STL中的集合容器。

只要两个集合有一个兴趣相同就要合并。


#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstdlib>
#include <set>
#include <algorithm>
#include <vector>

using namespace std;


struct node {
	set<int> s;
	int father, index;
};

void setUnion(node &n1, node &n2);
bool merge(node &n1, node &n2);
bool comp(int v1, int v2);

int main(void)
{
	int N, k, h, i, j;
	node arr[1000];
	set<int> s;
	scanf("%d", &N);
	for (i = 0; i < N; i++) {
		arr[i].father = -1;
		arr[i].index = i;
		scanf("%d:", &k);
		for (j = 0; j < k; j++) {
			scanf("%d", &h);
			s.insert(h);
		}
		arr[i].s.insert(s.begin(), s.end());
		s.clear();
	}
	
	for (i = 0; i < N - 1; i++) {
		if (arr[i].father < 0) {
			for (j = i + 1; j < N; j++) {
				if (arr[j].father < 0) {
					if (merge(arr[i], arr[j])) {
						break;
					}
				}
			}
		}
	}
	vector<int> v;
	for (i = 0; i < N; i++) {
		if (arr[i].father < 0) {
			v.push_back(-(arr[i].father));
		}
	}
	sort(v.begin(), v.end(), comp);
	printf("%d\n", v.size());
	if (v.size()) {
		printf("%d", v[0]);
		for (i = 1; i < v.size(); i++) {
			printf(" %d", v[i]);
		}
	}
	putchar('\n');
	return 0;
}

bool comp(int v1, int v2) {
	return v1 > v2;
}

void setUnion(node &n1, node &n2) {
	n2.father = n1.father + n2.father;
	n1.father = n2.index;
	n2.s.insert(n1.s.begin(), n1.s.end());
	return;
}
bool merge(node &n1, node &n2) 
{
	set<int>::iterator it1, it2;
	bool flag = false;
	it1 = n1.s.begin();
	it2 = n2.s.begin();
	while (it1 != n1.s.end() && it2 != n2.s.end()) {
		if (*it1 > *it2) {
			it2++;
		}
		else if (*it1 < *it2) {
			it1++;
		}
		else {
			flag = true;
			break;
		}
	}
	if (flag) {
		setUnion(n1, n2);
	}
	return flag;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值