1.非路径压缩:
递归版:
__int64 findroot(__int64 x)
{
if(x!=fa[x]) return findroot(fa[x]);
return fa[x];
}
非递归版:
__int64 findroot(__int64 x)//查找x的根节点
{
__int64 r=x;
while(r!=fa[r]) r=fa[r];
return r;
}
2.带路径压缩:
递归版:
__int64 findroot(__int64 x)//找x的根节点
{
if(x==fa[x]) return fa[x];
fa[x]=findroot(fa[x]);//从x向上路径压缩
return fa[x];
}
非递归版:
__int64 findroot(__int64 x)
{
__int64 r=x;
while(r!=fa[r]) r=fa[r];//查找根节点
while(x!=fa[x]) //从a开始,向上路径压缩
{
__int64 tem=fa[x];
fa[x]=r;
x=tem;
}
return r;
}
还可根据题意对此函数进行修改使其实现其他的功能 如:记录x的父节点有多少个.
3.合并函数:
void Union(__int64 x,__int64 y)
{
__int64 fx=findroot(x);
__int64 fy=findroot(y);
if(fx!=fy)
{
fa[x]=fy;//另x的根节点为fy
// fa[fx]=fy;另x所在的树的根节点为fy
}
}
注意:区分是合并一个节点到一个树上还是合并两棵树;
查找根节点时用不用路径压缩:一般来说有向图不用压缩,具体判断还应结合时间复杂度.
详细讲解:http://blog.csdn.net/dellaserss/article/details/7724401