概要

Union-Findでは以下の操作を行うことができる

  • \(union(u, v)\): 要素uの属するグループと要素vが属するグループを1つにまとめる

  • \(find(u)\): 要素uが属するグループを求める

\(find(u) = find(v)\)であればuとvは同じグループに属することが分かる

計算量

\(O(\alpha(n))\)

(ただし、\(\alpha\)はアッカーマン関数の逆関数)

実装

#define N 100008

int parent[N];
int root(int x) {
  if(x == parent[x]) {
    return x;
  }
  return parent[x] = root(parent[x]);
}

bool unite(int x, int y) {
  int px = root(x), py = root(y);
  if(px == py) return false;

  if(px < py) {
    parent[py] = px;
  } else {
    parent[px] = py;
  }
  return true;
}

// 以下で初期化
//
// rep(i, n) parent[i] = i;
//