- κ·Έλν (νΈλ¦¬) μκ³ λ¦¬μ¦μΌλ‘ λ λ Έλκ° κ°μ κ·Έλνμ μν΄μλμ§ νλ³
- Union μ°μ° & Find μ°μ°
- union(x, y) : λ Έλλ₯Ό ν©μΉλ μ°μ°
- find(x) : xκ° μ΄λ κ·Έλνμ μν΄ μλμ§ νλ³νλ μ°μ° (λ Έλμ λ£¨νΈ λ Έλ νμ)
πΉοΈ μ λμ¨ νμΈλ κ³Όμ
νμ¬ 5κ°μ λ Έλλ μλ‘ μ°κ²°λμ΄μμ§ μμ μνμ΄λ―λ‘ λΆλͺ¨λ μκΈ° μμ μ κ°λ¦¬ν€κ³ μλ€. (λΆλͺ¨ λ Έλ μ΄κΈ°ν)
xλ λ Έλ λ²νΈμ΄κ³ , parent[x]λ xκ° μ΄λ€ λΆλͺ¨ λ Έλμ μν΄ μλμ§ λνλΈλ€.
1οΈβ£ union(1, 2)
λ Έλ 1κ³Ό λ Έλ 2λ₯Ό ν©μΉλ€. λ Έλ 2μ λΆλͺ¨ λ Έλλ 1μ΄ λμλ€. parent[2] = 1
2οΈβ£ union(3, 4) / union(3, 5)
λ
Έλ 3κ³Ό λ
Έλ 4λ₯Ό ν©μΉκ³ , λ
Έλ 3κ³Ό λ
Έλ 5λ₯Ό ν©μΉλ€.
λ
Έλ 4μ λ
Έλ 5μ λΆλͺ¨λ λͺ¨λ λ
Έλ 3μ΄ λμλ€. parent[3] = 3, parent[4] = 3, parent[5] = 3
λΆλͺ¨λ₯Ό ν©μΉ λλ μΌλ°μ μΌλ‘ λ μμ κ° μͺ½μΌλ‘ ν©μΉλ€.
λ Έλ 2μ 4μ λΆλͺ¨ λ Έλλ find μ°μ°μΌλ‘ μ°Ύμ μ μλ€. find(2) = 1, find(4) =3
3οΈβ£ union(2, 4)
λ Έλ 2κ° μν κ·Έλνμ λ Έλ 4κ° μν κ·Έλνλ₯Ό ν©μΉλ€.
1κ³Ό 4μ λΆλͺ¨κ° λ€λ₯΄κΈ° λλ¬Έμ 볡μ‘ν κ·Έλν μμμλ '1κ³Ό 4κ° μ°κ²°λμλ€'λ κ²μ νμ νκΈ° μ΄λ €μΈ μ μλ€.
μ΄λ μ¬κ·ν¨μλ₯Ό μ¬μ©ν΄μ 4μ λΆλͺ¨μΈ 3μ λ¨Όμ μ°Ύμ ν, 3μ λΆλͺ¨μΈ 1μ μ°Ύμμ κ²°κ³Όμ μΌλ‘ 4μ λΆλͺ¨κ° 1μΈ κ²μ νμΈν΄ μλ‘ μ°κ²°λμμμ νμ ν μ μλ€.
find(3)=1, find(4)=1
μ λμ¨ νμΈλ μ½λ ꡬν
union μ°μ°
public static boolean union(int x, int y) {
x = find(x); //xμ λΆλͺ¨λ
Έλ μ°ΎκΈ°
y = find(y); //yμ λΆλͺ¨λ
Έλ μ°ΎκΈ°
// μ΄λ―Έ κ°μ κ·Έλνμ μν΄μμ λ false λ°ν
if(x == y) return false;
if(x <= y) parent[y] = x;
else parent[x] = y;
return true;
}
find μ°μ°
public static int find(int x) {
if(parent[x] == x) return x;
return parent[x]=find(parent[x]);
}
'μκ³ λ¦¬μ¦ > ποΈ μ 리' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Bellman-Ford (벨λ§-ν¬λ) (0) | 2023.09.08 |
---|---|
LCA (μ΅μ곡ν΅μ‘°μ) (0) | 2023.09.04 |
Binary Search (μ΄λΆνμ) (0) | 2023.09.01 |
Floyd-Warshall (νλ‘μ΄λ μμ ) (0) | 2023.08.29 |
Dijkstra (λ€μ΅μ€νΈλΌ) (0) | 2023.03.03 |