十、森林与并查集---(3)并查集的查询

//摘自计蒜客:http://www.jisuanke.com/course/35/7056

并查集的查询操作是指查询某个元素的代表。通常用于判断两个元素是否在一个集合内,也是并查集合并操作的基础。

原理如下:

        首先对node的类型分类讨论。如果node是所在集合的代表元素,也就是对应有根树根的话,则直接返回node的值;但如果node不是所在集合的代表元素,我们就需要不断递归node的父结点,直到找到了集合的代表元素为止。每个集合都是一个有根树,我们求解一个集合的代表元素,等价于我们要找到一棵树的根。如下图a,b,如果我们要查询的结点是g,那么我们就依次查询g的父结点d,d的父结点f......直到发现f是树的根,我们便停止递归迭代。


代码实现:

#include <iostream>
using namespace std;


class DisjointSet {
private:
    int *father;
public:
    DisjointSet(int size) {
        father = new int[size];
        for (int i = 0; i < size; ++i) {
            father[i] = i;
        }
    }
    ~DisjointSet() {
        delete[] father;
    }
    int find_set(int node) {


        if (father[node] != node) {
            //我们通过记录node的father信息,不断递归调用find_set查询当前结点的父结点,直到找到有根
            //树的根,此时也就意味着我们找到了集合的代表元素了
            return find_set(father[node]);
        }
        return node;
    }
};


int main() {
    DisjointSet dsu(100);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值