【发布时间】:2017-09-19 13:53:10
【问题描述】:
我本来希望C++ Standard Library 中包含这样一个有用的数据结构,但我似乎找不到它。
【问题讨论】:
-
我不认为它的广泛有用到值得去标准化、实施和维护。 (我的直觉是,将从中受益的 C++ 项目的百分比更接近于 0 而不是 1。)
标签: c++ stl disjoint-sets union-find
我本来希望C++ Standard Library 中包含这样一个有用的数据结构,但我似乎找不到它。
【问题讨论】:
标签: c++ stl disjoint-sets union-find
不是,但 boost 中有一个:http://www.boost.org/doc/libs/1_64_0/libs/disjoint_sets/disjoint_sets.html,所以如果你想要一个现成的实现,我会推荐这个。
【讨论】:
没有。我写了一个简单的实现。它的可扩展性很强。
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
}
【讨论】: