๋งž์™œํ‹€

๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(Breath First Search, BFS) ๋ณธ๋ฌธ

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}')
๋ฐ˜์‘ํ˜•