(一)并查集按秩合并:
void Union(int a,int b)
{
int x=Find(a);
int y=Find(b);
if(x==y)
return ;
if(ra[x]<ra[y])
{
p[x]=y;
}
else
{
p[y]=x;
if(ra[x]==ra[y])
ra[x]++;//ra数组就是记录树的高度,也就是所谓的秩
}
}
合并后的效果是这样:
可以看出,按秩合并后编号小的点的位于根结点。
(二)普通合并
void Union(int a,int b)
{
int fx=Find(a),fy=Find(b);
if(fx!=fy)
{
if(fx<fy)
p[fx]=fy;
else
p[fy]=fx;
}
}
效果如图:
可以看出,这样合并实现了编号大的结点位于根节点。