并查集的启发式合并

在原来刚接触并查集的时候,感觉确实很方便,也是认为并查集就那么点东西,简单方便,但是后来无意间发现了一个并查集的启发式合并,可以对并查集进行优化,它优化的理论是用一个数组来记录每个节点的深度,每一次合并都把节点向深度(高度)大的节点上进行合并,从而对最后的“生成树”深度进行了优化。受益匪浅,好长时间没写过博客了。。。emmm。。。

下面附带一个递归压缩路径找父节点的函数(其实很简单的那个)

rank 数组并没有给出,自己建立一个清零即可使用


int getf(int v) //查找他的父节点
{
    if(v == f[v])
        return f[v];
    else
    {   
        f[v] =getf(f[v]);
    }
}

//下面为启发式合并的核心代码,增加一个rank数组来储存每个节点的深度,总是把节点并在深度大的节点上
//这样做的好处是在后来查找时可以节省很多时间
void Merge(int u, int v)
{
    int t1 = getf(u);
    int t2 = getf(v);
    if(t1 != t2)
    {
        if(rank[t1] > rank[t2])
        {
            f[t2] = t1;
        }
        else if(rank t1 < rank[t2])
        {
            f[t1] = t2;
        }
        else
        {
            f[t2] = t1;
            rank[t1]++;
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值