serna37's Library

Logo

C++ アルゴリズムとデータ構造のライブラリ

View the Project on GitHub serna37/library-cpp

:heavy_check_mark: UnionFind 素集合データ構造
(library/various/union_find.hpp)

UnionFind 素集合データ構造

できること

計算量

使い方

UnionFind uf(N);
int sz = uf[p];
if (uf.unite(a, b)) {
    // つなげた場合
}
if (uf.find(a) == uf.find(b)) {
    // 同じグループである
}

Required by

Verified with

Code

#pragma once
struct UnionFind {
  private:
    vector<int> parent, size;

  public:
    UnionFind(int N) {
        parent.assign(N, -1);
        size.assign(N, 1);
    }
    int operator[](int p) { return size[find(p)]; }
    int find(int p) { return !~parent[p] ? p : (parent[p] = find(parent[p])); }
    bool unite(int a, int b) {
        int x = find(a), y = find(b);
        if (x == y) return false;
        if (size[x] > size[y]) swap(x, y);
        parent[x] = y, size[y] += size[x];
        return true;
    }
};
#line 2 "library/various/union_find.hpp"
struct UnionFind {
  private:
    vector<int> parent, size;

  public:
    UnionFind(int N) {
        parent.assign(N, -1);
        size.assign(N, 1);
    }
    int operator[](int p) { return size[find(p)]; }
    int find(int p) { return !~parent[p] ? p : (parent[p] = find(parent[p])); }
    bool unite(int a, int b) {
        int x = find(a), y = find(b);
        if (x == y) return false;
        if (size[x] > size[y]) swap(x, y);
        parent[x] = y, size[y] += size[x];
        return true;
    }
};
Back to top page