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;
}
只要两个集合有一个兴趣相同就要合并。
#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;
}
相关文章推荐
- PAT 解题报告 1004. Counting Leaves (30)
- PAT 1107. Social Clusters (30) 特殊问题+并查集+数量信息并查集
- 1107. Social Clusters (30) -- 简单 DFS / BFS
- 1076. Forwards on Weibo (30)解题报告
- pat 1107. Social Clusters (30)
- 【PAT】【Advanced Level】1107. Social Clusters (30)
- 1049. Counting Ones (30)解题报告
- 1107. Social Clusters (30)
- RQNOJ 30 愚蠢的矿工 解题报告
- 1107. Social Clusters (30) 并查集
- 1107. Social Clusters (30)
- [Leetcode] 30. Substring with Concatenation of All Words 解题报告
- 1111. Online Map (30)解题报告
- PAT_A 1107. Social Clusters (30)
- 1107. Social Clusters (30)
- 1107. Social Clusters (30)
- PAT (Advanced Level) Practise 1107 Social Clusters (30)
- 1107. Social Clusters (30)
- 1107. Social Clusters (30)
- 1107. Social Clusters (30)