/*
Hud 1856 More is Better
并查集.
rank数组表示,该树或者该集合成员个数.
把元素少的并到元素多的集合里面.
*/
#include<cstdio>
#define MAX 10000000
int father[MAX+2],rank[MAX+2];
void Init()
{
for(int i=1;i<=MAX;i++)
{
father[i]=i;
rank[i]=1;
}
}
int Find_Father(int x)
{
if(father[x]!=x)
father[x]=Find_Father(father[x]);
return father[x];
}
void Union(int a,int b)
{
int x=Find_Father(a);
int y=Find_Father(b);
if(x==y) return;
if(rank[x]>rank[y])
{
father[y]=x;
rank[x]+=rank[y];
}
else
{
father[x]=y;
rank[y]+=rank[x];
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
Init();
int a,b;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
Union(a,b);
}
int max=0;
for(int i=1;i<=MAX;i++)
if(rank[i]>max) max=rank[Find_Father(i)];
printf("%d\n",max);
}
}
/*
小小模板.
*/
#define MAX ?
int father[MAX],rank[MAX];
void Init()//初始化.每个结点都是一个集合
{
for(int i=1;i<=MAX;i++)
{
father[i]=i;
rank[i]=1;
}
}
int Find_Father(int x)
{//递归路径压缩
if(x==Find_Father(x))
father[x]=Find_Father(x);
return father[x];
}
void Union(int a,int b)
{
int x=Find_Father(a);
int y=Find_Father(b);
if(x==y) return;
if(rank[x]>rank[y])
{
father[y]=x;
rank[x]+=rank[y];
}
else
{
father[x]=y;
rank[y]+=rank[x];
}
}
相当囧啊!!
写了个小小的模板竟然错了。该模板做废。