- μλ‘μ μ§ν© (Disjoint Set) : κ΅μ§ν©μ΄ μλ, μ¦ κ³΅ν΅λλ μμκ° μλ μ§ν©μ λ§νλ€.
- Union-Find : μλ‘μ μ§ν©μ ννν λ μ¬μ©νλ μκ³ λ¦¬μ¦μ΄λ€. μλ‘μ μ§ν©μ μ 보λ₯Ό νμΈ(Find)νκ³ μ‘°μ(Union)νλ€.
- λ μμ a, bμ λν΄μ union(a, b)λ κ° μμκ° μν μ§ν©μ νλλ‘ ν©μΉλ€.
- μΌ λ, union(a, b)λ μ΄λ€.
- μ΄λ€ μμ aμ λν΄μ find(a)λ aκ° μν μ§ν©μ λν λ²νΈ(λ£¨νΈ λ Έλ)λ₯Ό λ°ννλ€.
- μ λν΄μ, find(a)λ μ§ν© Aμ λν λ²νΈ(λ£¨νΈ λ Έλ) μ΄λ€.
parent λ°°μ΄μ i μμμ λΆλͺ¨ λ Έλ λ²νΈλ₯Ό μ μ₯νλ€. i μμκ° λ£¨νΈ λ ΈλλΌλ©΄, μκΈ° μμ μ λ²νΈλ₯Ό μ μ₯νλ€.
function initialize()
for i : 1 ~ N
parent[i] = i
aμ λ£¨νΈ λ Έλκ° bμ λ£¨νΈ λ Έλλ₯Ό λΆλͺ¨λ‘ μΌκ²λ νλ€.
function union(a, b)
aRoot = find(a)
bRoot = find(b)
parent[aRoot] = bRoot
a μμμ λ£¨νΈ λ Έλ λ²νΈλ₯Ό λ°ννλ€.
function find(a)
if (parent[a] == a) return a
else return find(parent(a))
μ΄ λ, parent κ° Nκ°μΌ κ²½μ° μΌλ ¬λ‘ μ λ°λΌκ°κ² λκΈ° λλ¬Έμ O(N) μ μκ° λ³΅μ‘λκ° λμ¨λ€.
λ°λΌμ a μμμ λ£¨νΈ λ Έλλ₯Ό μ°Ύμ λλ§λ€ κ·Έ λΆλͺ¨ λ Έλλ₯Ό λ£¨νΈ λ Έλ κ°μΌλ‘ μΉνν΄μ£Όλ©΄ ν¨μ¬ ν¨μ¨μ μ΄λ€. O(logN)
function find(a)
if (parent[a] == a) return a
else return parent[a] = find(parent[a])