Last updated on
(C++) Union-find 구현
명세
vector<int> p 배열: 각 원소의 부모 원소를 저장하는 배열로, 초깃값은 자신(p[i] = i)이다.
vector<int> size 배열: 각 원소가 부모인 집합의 크기를 저장하는 배열로, 초깃값은 1이다.
unite 함수: small to big, 작은 집합을 큰 집합으로 합치는 테크닉을 활용해 O(logN)의 시간복잡도를 보장한다.
get 함수: small to big으로 합친 독립 집합에 path compression을 적용해 시간복잡도 amortized O(α(N))을 보장한다.
구현
vector<int> p(n + 1), size(n + 1, 1);
for (int i = 1; i <= n; i++) p[i] = i;배열 초기화 (1-based index 기준)
int get(int a, vector<int>& p) { if (p[a] == a) return a; return p[a] = get(p[a], p); }void unite(int a, int b, vector<int>& p, vector<int>& size) { a = get(a, p); b = get(b, p);
if (a == b) return; if (size[a] < size[b]) swap(a, b); size[a] += size[b]; p[b] = a;
}
함수 목록
// a와 b 집합을 합침 unite(a, b, p, size)
// 원소 a, b가 같은 집합에 포함되는지 여부를 확인 if (get(a, p) == get(b, p))