imeimi / Algorithm DB

Union-Find / Disjoint Set

1정의

유니온 파인드(Union-Find), 또는 서로소 집합(Disjoint Set Union, DSU)은 원소들을 겹치지 않는 집합들로 분리해 관리하는 자료구조다.

두 연산을 지원한다.

  • Find(x): x가 속한 집합의 대표 원소(루트)를 반환한다.
  • Union(x, y): x가 속한 집합과 y가 속한 집합을 하나로 합친다.

2구현

각 원소 x에 대해 parent[x]를 관리한다. 루트는 parent[x] == x인 원소다. 초기에는 모든 원소가 자기 자신을 부모로 가진다.

int parent[N];

void init(int n) {
    for (int i = 0; i < n; i++) parent[i] = i;
}

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

void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x != y) parent[x] = y;
}

find는 부모를 따라 올라가며 루트를 찾는다. unite는 두 루트 중 하나를 다른 하나의 자식으로 붙인다.

같은 집합인지 확인은 find(x) == find(y)로 한다.

3시간 복잡도

최적화 없이는 트리가 일렬 체인이 될 수 있다.

예시: unite(0, 1), unite(1, 2), ⋯, unite(n-2, n-1)을 순서대로 수행하면 0 → 1 → 2 → ⋯ → n−1 형태의 체인이 만들어진다. 이때 find(0)은 n−1번 포인터를 따라가야 한다.

연산최악 시간 복잡도
FindO(n)
UnionO(n)