题目:http://ac.jobdu.com/problem.php?pid=1444
题意:查找最大的集合,输出集合中的元素个数
思路:
用一个额外数组group[ i ] 记录以结点 i 为根节点的集合所含元素数,合并集合时累加。
注意的一点是:单点是单元素集合,初始化为1,而非0!
#include<cstdio>
#define maxSize 10000001
using namespace std;
int tree[maxSize];//记录根节点
int group[maxSize]; //记录以i为根节点的集合中所含元素个数
int findRoot(int i) {//寻找根节点
if (-1 == tree[i]) return i;
else {
int temp = findRoot(tree[i]);
tree[i] = temp; //路径压缩
return temp;
}
}
int main() {
int n, m;
while (scanf("%d", &n) != EOF) {//初始化
for (int j = 1; j <= maxSize; j++) {
tree[j] = -1;
group[j] = 1; //注:单点是单元素集合,此处要初始化为1,而非0
}
int a, b;
for (int i = 0; i < n; i++) {
scanf("%d %d", &a, &b);
a = findRoot(a);
b = findRoot(b);
if (b != a) {//合并为同一集合
tree[b] = a;
group[a] += group[b];
}
}
int sum = 1;
for (int i = 1; i <= maxSize; i++) {
if (-1 == tree[i] && sum < group[i])
//只需判断根节点即可,因为其他节点的group值定小于根节点
sum = group[i];
}
printf("%d\n", sum);
}
return 0;
}