
κ°λ
- κ·Έλν μ΄λ‘ μΌλ‘, μνΈ λ°°νμ μ§ν©(μλ‘μμ§ν©:Disjoint-Set) μκ³ λ¦¬μ¦μ΄λΌκ³ λ λΆλ¦
- μ£Όλ‘ ν¬λ£¨μ€μΉΌ(Krusckal) μκ³ λ¦¬μ¦μμ μ¬μ©νλ©°, μννμ§ μλ νΈλ¦¬ λ₯Ό λ§λ€κΈ° μν΄ μ¬μ©
λ¨κ³λ³λ‘ μ΄ν΄νκΈ°
- λ§μ½ μλ νμ κ°μ΄ 4κ°μ λ
Έλλ₯Ό κ°μ§ μλ‘μ μ§ν©μ΄ μλ€λ©΄,
λ Έλ λ²νΈ 1 2 3 4 λν λ²νΈ 1 2 3 4 - 1λ²κ³Ό 2λ²μ΄ κ°μ μ§ν©μ΄λΌλ©΄?
- λνλ²νΈλ₯Ό λ³κ²½νμ¬ κ°μ μ§ν©μ ννν μ μμ
- Union
- κ²°κ³Ό
λ Έλ λ²νΈ 1 2 3 4 λν λ²νΈ 1 1 3 4
- μλ νμ κ°μ΄ μμ λ 2λ²μ μ΄λ€ μ§ν©μ μλμ§ μ μ μμκΉ?
λ Έλ λ²νΈ 1 2 3 4 λν λ²νΈ 1 3 4 1 - λ
Έλ λ²νΈλ₯Ό λ°λΌκ°λ©° νμΈν μ μμ
- 2λ² π 3λ² π 4λ² π 1λ² (λͺ¨λ κ°μ μ§ν©)
- Find
- λ€λ₯Έ νν
λ Έλ λ²νΈ 1 2 3 4 λν λ²νΈ 1 1 1 1
- λ
Έλ λ²νΈλ₯Ό λ°λΌκ°λ©° νμΈν μ μμ
ꡬν
λ¨κ³
1. Make (Root λ°°μ΄ μμ±)
2. Find (spot `x` μ λν root spot μ°ΎκΈ°)
3. Union (spot `x`μ spot `y` λ₯Ό ν©νμ¬ νλμ μ§ν©μΌλ‘ λ§λ€κΈ°)
- Make()
- λΆλͺ¨ λ Έλλ₯Ό μ μ₯ν λ°°μ΄ μμ±
- Find()
- λΆλͺ¨ λ Έλ λ°°μ΄μ μ΄μ©νμ¬ μμ μ Rootλ₯Ό μ°Ύμκ°
- μ¬κ·λ₯Ό νμ©νμ¬ κ΅¬ν(λ°°μ΄λ‘ μ¬μ©νλ κ²λ³΄λ€ λΉ λ¦)
- λΉ λ₯Έ μ΄μ
- Union()
- μλ‘ λ€λ₯Έ λ νΈλ¦¬(μ§ν©)μ νλμ νΈλ¦¬(μ§ν©)μΌλ‘ λ¬Άμ
- Find() ν¨μλ₯Ό μ΄μ©νμ¬ μλ‘μ λΆλͺ¨κ° λ€λ₯Έ κ²½μ° λ λ Έλλ₯Ό μ°κ²°
- β λΆλͺ¨ λ
Έλ λ°°μ΄μ Root λ°°μ΄λ‘ λ³ννμ¬ μ΅μ ν ν΄λ³΄μ
- Find() ν¨μλ₯Ό ꡬν μ, Root λ°°μ΄μ μ μ₯νλ©° μ°Ύμκ°κΈ°
μκ° λ³΅μ‘λ
- μ΄ 3κ°μ§ κ³Όμ μ κ°μ§κ³ μμ΄ κ³Όμ λ³λ‘ μ΄ν΄λ³΄μ
- μ΄κΈ°ν
- Nκ°μ κ°μ κ°λ Root λ°°μ΄μ΄ νμνλ―λ‘, O(N)
- Find
- νκ· μ μΌλ‘ νΈλ¦¬μ λμ΄λ§νΌ νμ, O(logN)
- μ¬ν₯νΈλ¦¬μ κ²½μ°, O(N)
- μ΄κΈ°ν

- 3. Union
- Find ν¨μλ₯Ό μ¬μ©νμ¬ Find ν¨μμ μκ° λ³΅μ‘λλ₯Ό λ°λΌκ°
μ½λ
1. make()
# root λ°°μ΄ μμ±
parent = [i for i in range(n+1)]
2. Find()
def find(num:int)->int:
# λν λ²νΈ(Root)κ° 'λ' μ΄λ©΄ λ
if parent[num] == num:
return num
# λν λ²νΈ(Root)λ₯Ό μ°Ύμκ°λ©΄μ μ§λμ¨ λ°°μ΄μ μ μ₯
parent[num] = find(parent[num])
return parent[num]
3. Union()
def union(num1:int, num2:int) -> None:
x = find(num1)
y = find(num2)
if x != y:
parent[y] = x
return
μμ
https://www.acmicpc.net/problem/1717
1717λ²: μ§ν©μ νν
μ΄κΈ°μ $n+1$κ°μ μ§ν© $\{0\}, \{1\}, \{2\}, \dots , \{n\}$μ΄ μλ€. μ¬κΈ°μ ν©μ§ν© μ°μ°κ³Ό, λ μμκ° κ°μ μ§ν©μ ν¬ν¨λμ΄ μλμ§λ₯Ό νμΈνλ μ°μ°μ μννλ €κ³ νλ€. μ§ν©μ νννλ νλ‘κ·Έλ¨μ μ
www.acmicpc.net
2024.01.07 - [Algorithm/BaekJoon Review] - 1717. μ§ν©μ νν
1717. μ§ν©μ νν
https://www.acmicpc.net/problem/1717 λ¬Έμ ν΄μ ν©μ§ν©κ³Ό κ°μ μ§ν©μΈμ§ νμΈνλ λ¬Έμ λ‘ λΆλ¦¬μ§ν©(Union-Find)μ λνμ μΈ λ¬Έμ μ΄λ€. ꡬν λ°©λ² μ΄ 3λ¨κ³λ‘ λλμ΄ κ΅¬ν Rootλ₯Ό μ μ₯ν λ°°μ΄ μ΄κΈ°ν Find ν¨μ
l1m3kun.tistory.com
μ°Έμ‘°
νΈλ¦¬λ₯Ό μ¬μ©νλ μ΄μ
Tree vs Array
1. νν λ°©μ
Tree
νλμ νΈλ¦¬λ₯Ό κ°μ μ§ν©μΌλ‘ νν
Array
κ°μ λ°°μ΄μ κ°μ μ§ν©μΌλ‘ νν
2. μκ° λ³΅μ‘λ
Tree
Make() : O(N)
Union() = Find() = O(N-1) (νΈλ¦¬μ λμ΄)
Array
Make() : O(N)
Union() : O(N) (Nκ°μ λ°°μ΄ μννλ©° λν λ²νΈ λ³κ²½)
Find() : O(1) ( λ°°μ΄ μΈλ±μ€ μ½κΈ°)
κ²°λ‘ : μκ°λ³΅μ‘λκ° λΉ λ¦
'π STUDY > μλ£κ΅¬μ‘° & μκ³ λ¦¬μ¦' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| ν¬λ£¨μ€μΉΌ(Kruskal) - μ΅μ μ μ₯ νΈλ¦¬(MST) (1) | 2024.01.10 |
|---|---|
| 18111. λ§μΈν¬λννΈ (1) | 2024.01.09 |
| 1717. μ§ν©μ νν (2) | 2024.01.07 |
| 13994. μλ‘μ΄ λ²μ€ λ Έμ (0) | 2023.03.06 |
| 4613. λ¬μμ κ΅κΈ° κ°μ κΉλ° (0) | 2023.03.06 |