CS/Algorithm

λ„ˆλΉ„ μš°μ„  탐색(Breath First Search, BFS)

deo2kim 2020. 9. 27. 20:05
λ°˜μ‘ν˜•

πŸ“” λ„ˆλΉ„ μš°μ„  탐색(BFS) μ΄λž€

  • λ„ˆλΉ„λ₯Ό μš°μ„ μœΌλ‘œ ν•˜μ—¬ 탐색을 μˆ˜ν–‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜
  • μ΅œλ‹¨κ²½λ‘œ(μ΅œλ‹¨κΈΈμ΄)λ₯Ό 찾을 λ•Œ 주둜 μ‚¬μš©ν•œλ‹€.
  • 큐와 κ·Έλž˜ν”„λ‘œ ν•΄κ²°ν•œλ‹€. (νŒŒμ΄μ¬μ—μ„œλŠ” 데크(deque)λ₯Ό μ“°λ©΄ 속도가 빠름)

 

πŸ“” λ„ˆλΉ„ μš°μ„  탐색(BFS) κ΅¬ν˜„

from collections import deque

# μΈμ ‘λ¦¬μŠ€νŠΈ
# λ…Έλ“œ: 1,2,3,4,5,6,7
n = 7
adj = {x: [] for x in range(1, n + 1)}
edges = [
    [1, 2],
    [1, 3],
    [2, 4],
    [2, 5],
    [3, 6],
    [3, 7]
]

# 무방ν–₯ κ·Έλž˜ν”„μ΄λ―€λ‘œ λ°˜λŒ€μͺ½λ„ 성립
for edge in edges:
    s, e = edge
    adj[s].append(e)
    adj[e].append(s)

print(adj)

# bfs λŠ” queueλ₯Ό μ‚¬μš©ν•œλ‹€. 속도가 λΉ λ₯Έλ°ν¬λ₯Ό μ‚¬μš©
q = deque()
q.append(1)
visited = [False] * (n + 1)  # 각 인덱슀 λ°©λ¬Έν•œ 적이 μžˆλŠ”μ§€
visited[1] = True
visited_seq = []
while q:
    c = q.popleft()  # 큐 ꡬ쑰 μ΄λ―€λ‘œ κ°€μž₯ μ•žμ˜μ›μ†Œ(제일 μ²˜μŒμ— λ“€μ–΄μ˜¨)λ₯Ό κΊΌλ‚Έλ‹€.

    for neighbor in adj[c]:  # c의 이웃 λ…Έλ“œ(cμ—μ„œ λ°”λ‘œ 갈 수 μžˆλŠ” κ³³)
        if not visited[neighbor]:  # λ°©λ¬Έν•œμ μ΄ μ—†μœΌλ©΄
            q.append(neighbor)  # 큐에 λ„£μ–΄μ£Όκ³ 
            visited[neighbor] = True  # λ°©λ¬Έ ν‘œμ‹œ

    visited_seq.append(c)  # μ—¬κΈ΄ μ•ˆμ¨μ€˜λ„ λœλ‹€. 단지 λ°©λ¬Έμˆœμ„œλ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ 것

print(f'λ°©λ¬Έμˆœμ„œ {visited_seq}')
λ°˜μ‘ν˜•