概要
辺で繋がれた頂点たちが同じグループに属するか、という問題を木構造で管理します。
AtCoderのの解説スライドがとてもわかりやすいです。
- Union Find – AtCoder Typical Contest 001
サンプルコード
struct UnionFind {
vector<int> parent;
vector<int> num_node;
UnionFind(int N) : parent(N), num_node(N, 1) {
for (int i = 0; i < N; i++) {
parent[i] = i;
}
}
// 根を求める
int root(int x) {
if (parent[x] == x) {
return x;
}
// 経路圧縮
parent[x] = root(parent[x]);
return parent[x];
}
// 同一判定
bool is_same(int x, int y) {
return this->root(x) == this->root(y);
}
// 併合
void unite(int x, int y) {
x = this->root(x);
y = this->root(y);
// すでに一緒ならなにもしない
if (x == y) {
return;
}
parent[x] = y;
num_node[y] += num_node[x];
}
// 同一グループのノード数
int size(int x) {
return num_node[root(x)];
}
};
関連問題
- Decayed Bridges (ABC120)