并查集的理解

定义:

并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的合并、查询)。
比如:我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。

主要构成:

并查集主要由一个整型数组pre[ ]和两个函数:查找函数(findIndex)、**合并函(unionNum)**构成。
数组 _ufs[ ] 记录了每个点的前驱节点是谁,函数 findIndex(x) 用于查找指定节点 x 属于哪个集合,函数 unionNum(x1,x2) 用于合并两个节点 x1 和 x2 。

作用:

并查集的主要作用是求连通分支数(如果一个图中所有点都存在可达关系(直接或间接相连),则此图的连通分支数为1;如果此图有两大子图各自全部可达,则此图的连通分支数为2……)

代码及解析:

class UnionFindSet {
public:
//初始化一个数组,并且数组的每个值都是-1,表示当前组只有一个元素并且,没有父节点
    UnionFindSet(int n) {
        _ufs.resize(n, -1);
    }

//查找节点x的最上层的根节点的下标值
    int findIndex(int x) {
        assert(x < _ufs.size());

        while (_ufs[x] >= 0)
            x = _ufs[x];
        return x;
    }
    
 //	x1 下标和 x2 下标合并
 //1.首先判断安全
 //2.查找到当前下标对应的跟节点的下标值
 //3.将x2根节点下标的值—(即为-n)与x1对应根节点的下标的值相加,赋值给x1的下标对应根节点的值,表示当前组织关系共有多少个 
 //4.将x2根节点的下标值变为x1的下标

    void unionNum(int x1, int x2) {
        assert(x1 < _ufs.size());
        assert(x2 < _ufs.size());
        int root1 = findIndex(x1);
        int root2 = findIndex(x2);
        if (root1 != root2) {
            _ufs[root1] += _ufs[root2];
            _ufs[root2] = root1;
        }
    }
//返回共有多少个组织
    int setSize() {
        int size = 0;
        for (int i = 0; i < _ufs.size(); ++i) {
            if (_ufs[i] < 0)
                ++size;
        }
        return size;
    }
private:
    vector<int> _ufs;
};

0 1 2 3 4 5 6 7 8

-1 -1 -1 -1 -1 -1 -1 -1 -1

下标对应值初始化为-1,当两个值为一组织,则将其中一个作为根,将两下标的值相加,放在根下,另一下标对应的值变为根下标。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值