http://acm.hdu.edu.cn/showproblem.php?pid=1856
还是并查集,不一样的地方就是找出最大的那个集合的元素个数。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define M 10000001
#define INF 0x3f3f3f3f
int p[M];
int t[M];
int find(int a)
{
return p[a]==a?a:p[a]=find(p[a]);
}
void uni(int a,int b)
{
int x=find(a),y=find(b);
if(x!=y)
{
p[x] = y;
}
}
int main()
{
int n;
while(scanf("%d",&n)==1)
{
memset(t,0,sizeof(t));
for(int i = 1;i <= 10000000;i++)
p[i] = i;
int max = -INF;
for(int i = 0;i < n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(a>max) max=a;
if(b>max) max=b;
uni(a,b);
}
int max1 = 1;
for(int i = 1;i <= max;i++)
{
t[find(i)]++;
if(t[find(i)]>max1) //找出最大的集合
max1=t[find(i)];
}
printf("%d\n",max1);
}
return 0;
}