#include<cstdio>
#define N 10000005
int pre[N];
int num[N];
void init()
{
for(int i=1; i<=N; i++)
{
num[i]=1;
pre[i]=i;
}
}
int find(int x)
{
int r=x;
while(r!=pre[r])
r=pre[r];
int i=x,j;
while(i!=r)
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void merge(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
num[fy]+=num[fx];
pre[fx]=fy;
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==0)
{
printf("1\n");
continue;
}
init();
int max=0;
while(n--)
{
int x,y;
scanf("%d%d",&x,&y);
if(x>max) max=x;
if(y>max) max=y;
merge(x,y);
}
int maxn=0;
for(int i=1; i<=max; i++)
if(num[i]>maxn)
maxn=num[i];
printf("%d\n",maxn);
}
return 0;
}
上面是AC代码,核心思想就是求出集合元素个数的最大值,然而我们知道,寻找每一位元素的时候通过merge[]集合寻找到根节点是否相同,如果不相同,则将pre【】集合的根节点更新,如此我们可以在更新的时候进行计数,num[]就是一个计数集合,
我们只需要寻找最大值就可以了。。。欢迎提问,别忘了关注呦!!!
并查集之求集合的元素的最大个数----hdu1856 more is better
原文:http://www.cnblogs.com/calmwithdream/p/4921328.html