μ λμ¨-νμΈλ(Union-Find)
ν΄λΉ κΈμ μ μ, λ³ΈμΈμ΄ μ΄ν΄νκΈ° μν΄μ μ΄ κΈμμ λ°νλλ€. (곡λΆνμ!)
μλ‘μ μ§ν©(Disjoint Set)
Disjoint Set(μλ‘μ μ§ν©, λΆλ¦¬ μ§ν©)μ΄λ μλ‘ κ³΅ν΅λ μμλ₯Ό κ°μ§κ³ μμ§ μμ λ κ° μ΄μμ μ§ν©μ λ§ν©λλ€.(μ€!)
μ λμ¨-νμΈλ(Union-Find)
μ λμ¨-νμΈλ μκ³ λ¦¬μ¦μ ν©μ§ν© νκ³ ν΄λΉ μμκ° μμλ μ§ν©μ μ°Ύμλ΄λ(Find) νλ μκ³ λ¦¬μ¦μ΄λ€.
μλ‘μ μ§ν© μκ³ λ¦¬μ¦μΌλ‘λ λΆλ¦¬λ©°, λ Έλ κ°μ μ°κ²° κ΄κ³λ₯Ό μ¬μ©νλ λ±μΌλ‘ μμ£Ό μ¬μ©λλ€.
1. κΈ°λ³Έ μ°μ°
- Union μ°μ° : λ κ°μ μ§ν©μ νλμ μ§ν©μΌλ‘ ν©μΉλ μ°μ°μ
λλ€. μ¦, ν νΈλ¦¬μ 루νΈλ₯Ό λ€λ₯Έ νΈλ¦¬μ 루νΈμ μ°κ²°νμ¬ λ νΈλ¦¬λ₯Ό νλλ‘ κ²°ν©ν©λλ€.
- find μ°μ°μ ν΅ν΄ λ μμμ λ£¨νΈ λ Έλλ₯Ό μ°Ύμ.
- λ λ£¨νΈ λ Έλμ€ νλλ₯Ό λ€λ₯Έ νΈλ¦¬μ λ£¨νΈ λ Έλ μλμ λ°°μΉνμ¬ λ νΈλ¦¬λ₯Ό ν©μΉ¨.
- μ£Όμμ !
- μ ν νΈλ¦¬κ° μκΈΈμ μλ€.
- Find μ°μ°μ΄ O(N)μ΄ κ±Έλ¦¬κ² λλ€.
- Find μ°μ° : μ΄λ€ μμκ° μ£Όμ΄μ‘μ λ μ΄ μμκ° μν μ§ν©μ λν μμ(=λ£¨νΈ λ Έλ)λ₯Ό λ°ννλ μ°μ°μ λλ€ μ΄ μ°μ°μ λν μμμ λλ¬ν λκΉμ§ λΆλͺ¨ λ°°μ΄μ μ¬κ·μ μΌλ‘ μνν©λλ€.
2. μ©λ.
μ§ν© μμ μ¬λΆ νλ¨. : μμμ λ λ Έλκ° λμΌν μ§ν©μ μν΄ μλμ§λ₯Ό νμΈν μ μλ€. κ·Έλν λΌλ©΄ μμμ λ λ Έλκ° μ°κ²°λμ΄ μλμ§λ₯Ό νλ¨ν μ μλ€.
κ²½λ‘ μμΆ: Find μ°μ°μ€ μμΆ κΈ°λ²μ μ¬μ©νμ¬, κ·Έλν λ΄μμ λ Έλκ°μ κ²½λ‘λ₯Ό μ΅μ νν μ μλ€. → μκ°λ³΅μ‘λλ₯Ό ν₯μν μ μλ€.
μ¬μ΄ν΄ κ°μ§ : κ·Έλν νμ μ€μ μλ‘μ΄ μ°κ²°(Edge)μ΄ μ¬μ΄ν΄μ λ§λλμ§ κ°μ§ν μ μλ€.
- κ·Έλ¬λ, 무방ν₯ κ·Έλνμμλ§ μ μ© κ°λ₯
3. κ³Όμ
- 1 Union μ°μ°
μ¬λ¬ λ Έλ μ€ λ λ Έλλ₯Ό μ ννμ¬ νλμ μ§ν©μΌλ‘ μ°κ²° νλ €κ³ νλ€!
1μ°¨μ λ°°μ΄μ λν λ Έλλ₯Ό κ°±μ ν΄μ£Όμ΄ νλμ μ§ν©μΌλ‘ λ¬Άλ κ³Όμ μ΄λ€.
*μ μν μ ! : Union μ°μ° μ νμ λν λ ΈλλΌλ¦¬λ₯Ό μ°κ²°ν΄μ£Όμ΄μΌ νλ€.
- μ°κ²°ν λ λ Έλλ₯Ό μ λ ₯μΌλ‘ λ°λλ€.
- λ λ Έλμ λν λ Έλλ₯Ό find()λ₯Ό ν΅ν΄ μ°Ύλλ€.
- λν λ ΈλλΌλ¦¬ unionμ μ§ννλ€.
static void union(int x, int y) {
int a = find(x);
int b = find(y);
if(a > b){
parents[b] = a;
}
else{
parents[a] = b;
}
}
-2 Find μ°μ°
νΉμ λ Έλμ λν λ Έλλ₯Ό μ°Ύμλ΄κ³ , λν λ Έλκ° κ°μΌλ©΄ ν΄λΉ λ Έλλ€μ΄ κ°μ μ§ν©μ μν΄ μλμ§λ₯Ό νμΈν μ μλ€. μ΄ μ°μ°μ λν μμμ λλ¬ν λκΉμ§ λΆλͺ¨ λ°°μ΄μ μ¬κ·μ μΌλ‘ μνν©λλ€.
μ΄κΈ°μ find μ°μ°μ μκΈ° μμ μ κ°λ¦¬ν¨λ€.
λ³ν©λ μ§ν©μ΄ μλ€λ©΄ κ·Έ μ§ν©μ λν λ Έλλ₯Ό λ°νν©λλ€.
static int find(int x) {
if (parents[x] == x) return x;
return parents[x] = find(parents[x]); // κ²½λ‘ μμΆ
}