1.非路径压缩:
递归版:
__int64 findroot(__int64 x)
{
if(x!=fa[x]) return findroot(fa[x]);
return fa[x];
}
非递归版:
__int64 findroot(__int64 x)
{
__int64 r=x;
while(r!=fa[r]) r=fa[r];
return r;
}
2.带路径压缩:
递归版:
__int64 findroot(__int64 x)
{
if(x==fa[x]) return fa[x];
fa[x]=findroot(fa[x]);
return fa[x];
}
非递归版:
__int64 findroot(__int64 x)
{
__int64 r=x;
while(r!=fa[r]) r=fa[r];
while(x!=fa[x])
{
__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;
}
}
注意:区分是合并一个节点到一个树上还是合并两棵树;
查找根节点时用不用路径压缩:一般来说有向图不用压缩,具体判断还应结合时间复杂度.