λ°μν
-- λ³Έ ν¬μ€ν μ μ΄κ²μ΄ μ·¨μ μ μν μ½λ© ν μ€νΈλ€ with νμ΄μ¬ μ± μ μ°Έκ³ νμ¬ μμ±λμμ΅λλ€.
1. DFS
- Depth First Search, κΉμ΄ μ°μ νμ
- κ·Έλνμ κΉμ λΆλΆμ μ°μ μ μΌλ‘ νμνλ μκ³ λ¦¬μ¦
- μ£Όλ‘ μ€νμ νμ©νλ λ°©μμ
- μ€ν : νμ νμΆ)
- λμλ°©μ
- νμ μμ λ Έλλ₯Ό μ€νμ μ½μ νκ³ λ°©λ¬Έμ²λ¦¬λ₯Ό νλ€.
- μ€νμ μ΅ μλ¨ λ Έλμ λ°©λ¬Ένμ§ μμ μΈμ λ Έλκ° μλ€λ©΄ κ·Έ μΈμ λ Έλλ₯Ό μ€νμ λ£κ³ λ°©λ¬Έμ²λ¦¬λ₯Ό νλ€. λ°©λ¬Ένμ§ μμ μΈμ λ Έλκ° μμΌλ©΄ μ€νμμ μ΅μλ¨ λ Έλλ₯Ό κΊΌλΈλ€.
- 2λ²μ κ³Όμ μ λ μ΄μ μνν μ μμ λκΉμ§ λ°λ³΅νλ€.
- λμλ°©μμ μλ κ·Έλνλ₯Ό μμλ‘ μ΄ν΄λ³΄μ.
- λ§μ§λ§μ "μ€νμ΄ λ€μ΄κ° μμ" λ₯Ό νλ° λͺ¨μ보면, 1,2,7,6,8,3,4,5 κ° λλ€.
βΆ DFSλ₯Ό μ½λλ‘ κ΅¬νν΄λ³΄κΈ°
- μμ λμΌν κ·Έλνλ₯Ό κ°μ§κ³ DFSλ₯Ό νλ‘κ·Έλλ° μ½λλ‘ κ΅¬νν΄λ³΄μ.
- μ€κΈλ‘ ννλ κ²λ³΄λ€ ν¨μ¬ κ°λ¨νλ€.
- λλΆλΆ μ¬κ·ν¨μλ₯Ό μ¬μ©νλ€. (λμμ리λ μ€νμ΄λ€)
#DFS λ©μλ μ μ
def DFS(graph, v, visited):
# νμ¬ λ
Έλλ₯Ό λ°©λ¬Έ μ²λ¦¬
visited[v] = True
# μ€νμ λ€μ΄κ° λ
Έλλ€μ΄ μμλλ‘ μΆλ ₯λλ€.
print(v, end='')
# νμ¬ λ
Έλμ μ°κ²°λ λ€λ₯Έ λ
Έλλ₯Ό μ¬κ·μ μΌλ‘ λ°©λ¬Έ
for i in graph[v]:
if not visited[i]:
DFS(graph, i, visited)
# κ° λ
Έλκ° μ°κ²°λ μ 보λ₯Ό 리μ€νΈ μλ£νμΌλ‘ νν (2μ°¨μ 리μ€νΈ)
graph = [
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
# κ° λ
Έλκ° λ°©λ¬Έλ μ 보λ₯Ό 리μ€νΈ μλ£νμΌλ‘ νν (1μ°¨μ 리μ€νΈ)
# μΌλ¨ 9κ°λ₯Ό Fasleλ‘ νννκ³ , λ°©λ¬Έν λλ§λ€ Trueλ‘ λ°κΎΈμ΄ μ€ κ²μ.
# λ
Έλ λ²νΈμ ν΅μΌμν€κΈ° μν΄ graph μλ grpah[0]μ λΉ λ¦¬μ€νΈλ₯Ό λ£μ΄μ£Όμκ³ , μ¬κΈ°μλ 9κ°λ‘.
visited = [False] * 9
# μ μλ DFSν¨μ νΈμΆ
DFS(graph, 1, visited)
## μΆλ ₯κ° ---> 1 2 7 6 8 3 4 5
2. BFS
- Breadth First Search, λλΉ μ°μ νμ
- κ°κΉμ΄ λ ΈλλΆν° νμνλ μκ³ λ¦¬μ¦
- μ£Όλ‘ νλ₯Ό νμ©νμ¬ κ΅¬νλ¨.
- ν : μ μ μ μΆ λ°©μμ μλ£κ΅¬μ‘°
- λμλ°©μ
- νμ μμ λ Έλλ₯Ό νμ μ½μ νκ³ λ°©λ¬Έμ²λ¦¬λ₯Ό νλ€.
- νμμ λ Έλλ₯Ό κΊΌλ΄ ν΄λΉ λ Έλμ μΈμ λ Έλ μ€ λ°©λ¬Ένμ§ μμ λ Έλλ₯Ό λͺ¨λ νμ μ½μ νκ³ λ°©λ¬Έμ²λ¦¬λ₯Ό νλ€.
- 2λ² κ³Όμ μ λ μ΄μ μνν μ μμ λκΉμ§ μ§ννλ€.
- λμλ°©μμ μλ κ·Έλνλ₯Ό μμλ‘ μ΄ν΄ν΄λ³΄μ.
- νμ λ€μ΄κ° μμλ 1, 2, 3, 8, 7, 4, 5, 6 μ΄ λλ€.
βΆ BFSλ₯Ό μ½λλ‘ κ΅¬νν΄λ³΄κΈ°
- μμμ λ€λ£¬ λμΌν κ·Έλνλ₯Ό κ°μ§κ³ BFSμ½λλ₯Ό ꡬνν΄ λ³Όκ²μ΄λ€.
- deque λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν μ μκΈ°μ ꡬνμ΄ κ°λ¨νλ€.
- deque λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ©΄ O(N)μ μκ°μ΄ μμλλ€.
- λ°λΌμ μΌλ°μ μΌλ‘ μ¬κ·ν¨μλ₯Ό μ¬μ©νλ DFS λ³΄λ€ μν μκ°μ΄ λ ν¨μ¨μ μ΄λ€.
from collections import deque
# BFS λ©μλ μ μ
def BSF(graph, start, visited):
# ν ꡬνμ μν΄ deque λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ© ν κ²μ΄λ€.
queue = deque([start])
# νμ¬ λ
Έλλ₯Ό λ°©λ¬Έμ²λ¦¬
visited[start] = True
# νκ° λΉ λκΉμ§ λ°λ³΅
while queue:
# νμ λ€μ΄κ° μμλ€μ΄ μμλλ‘ μΆλ ₯λλ€.
print(v, end=' ')
# ν΄λΉ μμμ μ°κ²°λ, μμ§ λ°©λ¬Ένμ§ μμ μμλ€μ νμ μ½μ
νμ.
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# κ° λ
Έλκ° μ°κ²°λ μ 보λ₯Ό μ°κ²°λ¦¬μ€νΈ λ°©μμΌλ‘ νν
graph = [
[],
[2,3,8],
[1,7],
[1,4,5],
[3,5],
[3,4],
[7],
[2,6,8],
[1,7]
]
# κ° λ
Έλκ° λ°©λ¬Έλ μ 보λ₯Ό 1μ°¨μ 리μ€νΈλ‘ νν
visited = [False] * 9
# BFS νΈμΆ
BFS(graph, 1, visited)
## μΆλ ₯λ κ²°κ³Ό ---> 1 2 3 8 7 4 5 6
λ°μν