UVA_10608
为了计数方便,我们在初始化并查集的数组p[]时全部初始化成-1,让树根的p[]值代表该集合内的人数。在合并时,令p[tx]+=p[ty]即相当将两组的人数进行了相加,同时令p[ty]=tx即让两组数据同时指向了一个树根。
#include<stdio.h>
#include<string.h>
int N,M,p[30010];
int find(int x)
{
return p[x]<0?x:(p[x]=find(p[x]));
}
void init()
{
int i,x,y,tx,ty;
scanf("%d%d",&N,&M);
memset(p,-1,sizeof(p));
for(i=0;i<M;i++)
{
scanf("%d%d",&x,&y);
tx=find(x);
ty=find(y);
if(tx!=ty)
{
p[tx]+=p[ty];
p[ty]=tx;
}
}
}
int check()
{
int i,ans=0;
for(i=1;i<=N;i++)
{
if(-p[i]>ans)
ans=-p[i];
}
return ans;
}
int main()
{
int t,ans;
scanf("%d",&t);
while(t--)
{
init();
ans=check();
printf("%d\n",ans);
}
return 0;
}