C++ アルゴリズムとデータ構造のライブラリ
#include "library/various/union_find.hpp"uf[p]: $O(α(N))$find: $O(α(N))$unite: $O(α(N))$UnionFind uf(N);
int sz = uf[p];
if (uf.unite(a, b)) {
// つなげた場合
}
if (uf.find(a) == uf.find(b)) {
// 同じグループである
}
#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;
}
};