c_cpp 实现disjoint_set数据结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 实现disjoint_set数据结构相关的知识,希望对你有一定的参考价值。

#include <algorithm>
#include <iterator>
#include <unordered_set>
#include <vector>

class disjoint_set {
    struct ranked { int root, rank, size; };

public:
    explicit disjoint_set(int n): cc(n + 1) {
        for (int i = 0; i <= n; ++i) {
            cc[i].root = i;
            cc[i].rank = 0;
            cc[i].size = 1;
        }
    }

    std::size_t size(int x) const {
        return cc[x].size;
    }

    std::unordered_set<int> roots() {
        std::unordered_set<int> lst;

        std::transform(std::next(cc.begin()), cc.end(), std::inserter(lst, lst.begin()),
            [&](const ranked& r) {
                return find(r.root);
            });

        return lst;
    }

    void join(int x, int y) {
        ranked &xr = cc[find(x)];
        ranked &yr = cc[find(y)];

        if (xr.root == yr.root) {
            return;
        }

        if (xr.rank < yr.rank) {
            xr.root = yr.root;
            yr.size += xr.size;
        } else if (xr.rank > yr.rank) {
            yr.root = xr.root;
            xr.size += yr.size;
        } else {
            xr.root = yr.root;
            yr.rank++;
            yr.size += xr.size;
        }
    }

private:
    std::vector<ranked> cc;

    int find(int p) {
        if (cc[p].root == p) {
            return p;
        }
        cc[p].root = find(cc[p].root);
        return cc[p].root;
    }
};

以上是关于c_cpp 实现disjoint_set数据结构的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp ObServer实现

c_cpp 28.实现strStr()

c_cpp 旧的vm实现

c_cpp 使用数组实现堆栈

c_cpp 通用QRunnable实现

c_cpp 哈希表实现