本题中的输入要用while(scanf() != EOF)或者while(~scanf()),用while(scanf())会TLE(超时)。
还要值得注意的是本题的内存限制是102400 kB,可以说是相当大了,故可以开两个长度为10000001的数组。
#include <stdio.h>
#define N 10000001
int t[N];
int ans[N]; //存储每个根节点的子节点数目
int findRoot(int x)
{
if(t[x] == x)
return x;
else
{
//若达到了递归结束的条件,则每一层递归返回值都是根节点编号
int temp = findRoot(t[x]);
t[x] = temp;
return temp;
}
}int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
for(int i = 1; i <= N; i++)
{
t[i] = i;
ans[i] = 1;
}
int a, b;
for(int i = 1; i <= n; i++)
{
scanf("%d%d", &a, &b);
//在并查集中插入元素时要先判断两个元素的根节点是否相同
a = findRoot(a);
b = findRoot(b);
if(a != b)
{
t[a] = b;
ans[b] += ans[a]; //将节点数目加入
}
}
int temp = 1;
for(int i = 1; i <= N; i++)
if(ans[i] > temp)
temp = ans[i];
printf("%d\n", temp);
}
return 0;
}