题目链接
大体思想是利用并查集,来求解连通分量个数,并另外再用一个数组sum来记录所包含元素个数,初始为1,再合并时,将被合并的这个sum加到另一个上,最后利用循环找到所包含元素最大的,在进行输出。注意运用printf提高处理速度,用cout会超时(这也体现了printf处理大量数据的优越性);
代码如下:
#include <iostream>
#include<stdio.h>
using namespace std;
#define N 10000001
int a[N], sum[N];
int find(int x) {
if (a[x] == -1) return x;
else {
int tmp = find(a[x]);
a[x] = tmp;
return tmp;
}
}
int main()
{
int n;
while (cin>>n)//scanf("%d",&n)!=EOF)
{
for (int i = 1;i < N;i++) {
sum[i] = 1;a[i] = -1;
}
for (int i = 0;i < n;i++)
{
int x, y;
cin >> x >> y;
//scanf("%d%d", &x, &y);
x = find(x);
y = find(y);
if (x != y)
{
a[x] = y;
sum[y] += sum[x];
}
}
int ans = 1;
int i = 1;
while (i<= N )
{
if ((sum[i] > ans)&&(a[i]==-1)) ans = sum[i];
i++;
}
printf("%d\n",ans);
}
return 0;
}