Description
给定多个无向图,给出这多个无向图中元素个数最多的一个是多少?
Input
输入一个n (0 ≤ n ≤ 100 000) - 后n行中每一行有一个A和B(A ≠ B, 1 ≤ A, B ≤ 10000000),代表A与B联通。
Output
给出节点数最多是多少?
Sample Input
4
1 2
3 4
5 6
1 6
4
1 2
3 4
5 6
7 8
Solution
并查集计算每棵树中节点数是多少即可。
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 10000011;
int Tree[maxn];
int FindRoot(int x)
{
int root, tmp = x;
//找x的根
while (Tree[x] != x)
x = Tree[x];
root = x;
x = tmp;
//路径压缩
while (Tree[x] != root)
{
int t = Tree[x];
//将节点的根指向最终根节点
Tree[x] = root;
x = t;
}
return root;
}
//递归版本
// int FindRoot(int x)
// { //查找某个结点所在树的根结点
// if (Tree[x] == x)
// return x;
// else
// {
// int tmp = FindRoot(Tree[x]);
// Tree[x] = tmp;
// return tmp;
// }
// }
int root[maxn], length[maxn];
int main()
{
// freopen("in.txt", "r", stdin);
int N;
while (~scanf("%d", &N))
{
//注意每次输入都要初始化
for (int i = 0; i <= maxn; i++)
{
Tree[i] = i;
length[i] = 0;
}
for (int i = 0; i < N; i++)
{
int a, b;
scanf("%d%d", &a, &b);
a = FindRoot(a);
b = FindRoot(b);
if (a != b)
Tree[a] = b;
}
for (int i = 0; i < maxn; i++)
{
int r = FindRoot(i);
length[r]++;
}
int ans = -1;
for (int i = 0; i < maxn; i++)
{
if (length[i] > ans)
ans = length[i];
}
printf("%d\n", ans);
}
return 0;
}