[Python] DFS & BFS
κ·Έλνλ νΈλ¦¬ ꡬ쑰μ λν΄μ μΆ©λΆν μ€λͺ μ΄ μλ κΈμ μλλλ€.
python μΌλ‘ DFS , BFS λ₯Ό ꡬννλ κ°λ¨ν μ½λμ κ·Έμ λν κ°λ μ μ 리νκ³ μμ΅λλ€.
κ·Έλνλ?
- μ¬μ©
μ§λ, λ€μ΄κ²μ΄μ μ μ°μ
SNS, λ©μ μ (νλ‘μ°/μΈνλ‘μ°)
κΉ VCS μ μ°μ
- μ μ (vertext == node) κ³Ό κ°μ (edge)λ‘ μ΄λ£¨μ΄μ Έ μμ.
- ꡬλΆ
1. 무방ν₯ κ·Έλν(==μλ°©ν₯ κ·Έλν)
2. λ°©ν₯ κ·Έλν
--------------------------------
1. μν κ·Έλν
2. λΉμν κ·Έλν
λ°©ν₯μ± λΉμν κ·Έλν(DAG) Directed Acyclic Graph
- μ°κ²°μμ
νΈλ¦¬λ?
- μνμ±X, 무방ν₯
- λ£¨νΈ λ Έλ, 리ν λ Έλ
- λ Έλ Aμμ λ Έλ Bλ‘ κ°λ κ²½λ‘λ λ°λμ μ‘΄μ¬νλ©° μ μΌνλ€.
κ·Έλνλ₯Ό μ΄λ»κ² μ½λλ‘?
1) μΈμ νλ ¬λ‘
0 | 1 | 2 | 3 | |
0 | 0 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 0 |
2 | 0 | 0 | 0 | 0 |
3 | 0 | 0 | 1 | 0 |
2) μΈμ 리μ€νΈλ‘
0 | →1→2→3
1 | →2
2 |
3 | →2
λ©λͺ¨λ¦¬: μΈμ νλ ¬λ³΄λ€ μΈμ 리μ€νΈκ° λ μ°μ
μκ°: μΈμ νλ ¬μ΄ μΈμ 리μ€νΈλ³΄λ€ λ μ°μ
κ·Έλν νμ μκ³ λ¦¬μ¦
1) DFS : κΉμ΄ μ°μ νμ
μ€ν λλ μ¬κ·(μ¬κ·λ μ€νμ) μ¬μ©ν΄μ ꡬν
BackTracking (ν΄λ₯Ό μ°ΎκΈ° μν΄μ μ²΄ν¬ νλ€κ°, μ μ½ μ‘°κ±΄μ λ§μ‘±ν μ μλ€κ³ νλ¨λλ©΄ μ¦μ λ€λ‘ λμκ°λ(μ΄ ν보ꡰμ μ²΄ν¬ νμ§ μμ κ²μ νκΈ° ν/ κ° ν보ꡰλ€μ DFSλ‘ νμΈνλ€.)
- μΌλ°μ μΈ DFS μκ° λ³΅μ‘λ
- λ Έλ μ: V
- κ°μ μ: E
- μ μ½λμμ while need_visit μ V + E λ² λ§νΌ μνν¨
- μκ° λ³΅μ‘λ: O(V + E)
def dfs(graph, start_node):
visited, need_visit = list(), list()
need_visit.append(start_node)
while need_visit:
node = need_visit.pop()
if node not in visited:
visited.append(node)
need_visit.extend(graph[node])
return visited
2) BFS: λλΉ μ°μ νμ
ν μ¬μ©νμ¬ κ΅¬ν
- μΌλ°μ μΈ BFS μκ° λ³΅μ‘λ
- λ Έλ μ: V
- κ°μ μ: E
- μ μ½λμμ while need_visit μ V + E λ² λ§νΌ μνν¨
- μκ° λ³΅μ‘λ: O(V + E)
def bfs(graph, start_node):
visited = list()
need_visit = list()
need_visit.append(start_node)
while need_visit:
node = need_visit.pop(0)
if node not in visited:
visited.append(node)
need_visit.extend(graph[node])
return visited