【问题标题】:Is the Union-Find (or Disjoint Set) data structure in STL?STL中的Union-Find(或Disjoint Set)数据结构是什么?
【发布时间】:2017-09-19 13:53:10
【问题描述】:

我本来希望C++ Standard Library 中包含这样一个有用的数据结构,但我似乎找不到它。

【问题讨论】:

  • 我不认为它的广泛有用到值得去标准化、实施和维护。 (我的直觉是,将从中受益的 C++ 项目的百分比更接近于 0 而不是 1。)

标签: c++ stl disjoint-sets union-find


【解决方案1】:

不是,但 boost 中有一个:http://www.boost.org/doc/libs/1_64_0/libs/disjoint_sets/disjoint_sets.html,所以如果你想要一个现成的实现,我会推荐这个。

【讨论】:

  • 没有文档,它在典型的 Boost 风格中是超级通用的,但this answerthis answer 给出了如何使用它的想法。
【解决方案2】:

没有。我写了一个简单的实现。它的可扩展性很强。

struct DisjointSet {
    vector<int> parent;
    vector<int> size;

    DisjointSet(int maxSize) {
        parent.resize(maxSize);
        size.resize(maxSize);
        for (int i = 0; i < maxSize; i++) {
            parent[i] = i;
            size[i] = 1;
        }
    }

    int find_set(int v) {
        if (v == parent[v])
            return v;
        return parent[v] = find_set(parent[v]);
    }

    void union_set(int a, int b) {
        a = find_set(a);
        b = find_set(b);
        if (a != b) {
            if (size[a] < size[b])
                swap(a, b);
            parent[b] = a;
            size[a] += size[b];
        }
    }
};

及用法如下。

void solve() {
    int n;
    cin >> n;
    DisjointSet S(n);  // Initializing with maximum Size
    S.union_set(1, 2);
    S.union_set(3, 7);
    int parent = S.find_set(1);  // root of 1
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多