王道机试练习——找朋友之求最大集合
题目描述
有 10000000 个小朋友,他们之中有 N 对好朋友,且朋友关系具 有传递性:若 A 与 B 是朋友, B 与 C 是朋友,那么我们也认为 A 与 C 是朋友。 在给出这 N 对朋友关系后,要求我们找出一个最大(人数最多)的集合,该集 合中任意两人之间都是朋友或者该集合中只有一个人,输出该最大人数。 如前例所示,我们利用并查集相关操作已经可以求得有几个这样符合条件的 集合,但是计算集合中的元素个数我们仍没有涉及。我们如果能够成功求得每个 集合的元素个数,我们只需要选择包含元素最多的集合,并输出该集合中的元素 个数即可。 为了计算每个集合的元素个数,我们不妨在表示每个集合的树的根结点记录 该集合所包含的元素个数,在合并时累加被合并两个集合包含的元素个数。最后, 找出所有集合中所包含元素最多的集合即是所求。
代码
#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
#define N 10000001
int Tree[N];
int findRoot(int x) {
if (Tree[x] == -1) return x;
else {
int tmp = findRoot(Tree[x]);
Tree[x] = tmp;
return tmp;
}
}
int sum[N];
int main() {
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 1; i <= N; i++) {
Tree[i] = -1;
sum[i] = 1;
}
while (n--) {
int a, b;
scanf("%d%d", &a, &b);
a = findRoot(a);
b = findRoot(b);
if (a != b) {
Tree[a] = b;
sum[b] += sum[a];
}
}
int ans = 1;
for (int i = 1; i <= N; i++) {
if (sum[i] > ans) ans = sum[i];
}
printf("%d\n", ans);
}
return 0;
}