Union by rank

int find(int x) {
  if (parent[x] != x) parent[x] = find(parent[x]);
  return parent[x];
}
void union(int x, int y) {
  int px = find(x), py = find(y);
  if (px == py) return;
  if (rank[px] < rank[py]) parent[px] = py;
  else if (rank[px] > rank[py]) parent[py] = px;
  else { parent[py] = px; rank[px]++; }
}
Advertisement

Union by size

Alternative to rank: track subtree size, attach smaller to larger. Also O(α(N)) amortized.

Advertisement

Path halving

Instead of full compression, halve path: parent[x] = parent[parent[x]]. Simpler, similar performance.

Weighted union-find

Track weight relative to root. Useful for arithmetic constraints. Sum along path during find.