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.youkuaiyun.com/dellaserss/article/details/7724401
本文详细介绍了并查集的基本概念及其实现方式,包括非路径压缩和带路径压缩的方法,并提供了具体的代码示例。同时,文章还讲解了如何通过并查集解决实际问题,例如合并操作等。

被折叠的 条评论
为什么被折叠?



