您的位置:首页 > 其它

1107. Social Clusters (30)解题报告

2016-12-30 20:57 351 查看
使用并查集和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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: