本题是并查集典型题目通过比较各个不相交集合,求出最大的集合包含的元素个数另外本题和其他题目有所区别的地方是本题的rank[x]记录的是x中所含的元素个数,而一般构造法记录的是x在树中的高度,之所以不采用高度的方法是因为并查后统计的规模很大,一个个统计必然超时。因此本题因从并查集构造原理来重新定义
#include <stdio.h>
#define Max 1000001
struct
{
int x;
int y;
}edge[100001];
int rank[Max];
int father[Max];
int maxpair;
int index;
void Make_set(int x)
{
rank[x]=1;
father[x]=x;
}
int Find_set(int x)
{
if(x!=father[x])
{
father[x]=Find_set(father[x]);
}
return father[x];
}
void Union(int x,int y)
{
if(x==y) return;
if(rank[x]>rank[y])
{
father[y]=x;
rank[x]+=rank[y];
if(rank[x]>maxpair)
maxpair=rank[x];
}
else
{
rank[y]+=rank[x];
if(maxpair<rank[y])
maxpair=rank[y];
father[x]=y;
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
maxpair=1;
int x,y;
for(int i=0;i<n;++i)
{
scanf("%d%d",&edge[i].x,&edge[i].y);
Make_set(edge[i].x);
Make_set(edge[i].y);
}
for(i=0;i<n;++i)
{
edge[i].x=Find_set(edge[i].x);
edge[i].y=Find_set(edge[i].y);
if(edge[i].x!=edge[i].y)
{
Union(edge[i].x,edge[i].y);
}
}
printf("%d\n",maxpair);
}
}