BFS(๋๋น ์ฐ์ ํ์) ์๊ณ ๋ฆฌ์ฆ
๊ทธ๋ํ ์ ์ฒด๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ ์ค ํนํ "๊น์ด"๋ฅผ ์ฐ์ ์ ์ผ๋ก ํ์
์คํ ์๋ฃ๊ตฌ์กฐ(ํน์ ์ฌ๊ท ํจ์)๋ฅผ ์ด์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ฏ๋ก ์ค์ ๊ตฌํํ ๋ ์ฌ๊ท ํจ์๋ฅผ ํ์ฉํ๋ฉด ๊ฐ๊ฒฐํ ์ฝ๋๊ฐ ๊ฐ๋ฅํ๋ค.
์คํ์ ๋ฆฌ์คํธ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ append์ pop์ด O(1)์ด๋ค.
๊ทธ๋ํ์์ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ์ฐ์ ์ ์ผ๋ก ํ์
BFS์ DFS๊ฐ ํท๊ฐ๋ ค์ ๋น๊ตํด๋ณด์๋ค.
from collections import deque
# BFS ๋ฉ์๋ ์ ์
def bfs(graph, start, visited):
# ํ(Queue) ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
queue = deque([start])
# ํ์ฌ ๋
ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[start]=True
# ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
while queue:
# ํ์์ ํ๋์ ์์๋ฅผ ๋ฝ์ ์ถ๋ ฅํ๊ธฐ
v= queue.popleft()
print(v,end=' ')
# ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ํ ์์๋ค์ ํ์ ์ฝ์
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i]=True
# ๊ฐ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ํํ (2์ฐจ์ ๋ฆฌ์คํธ)
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)
# 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์ฐจ์ ๋ฆฌ์คํธ)
visited=[False]*9
# ์ ์๋ DFS ํจ์ ํธ์ถ
dfs(graph, 1, visited)
DFS์ BFS๋ ํธ๋ฆฌ๋ ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ์๋ก ์ฐ๊ฒฐ๋ ๋ ธ๋๋ฅผ ํ์ ํ ์ ์๋ค.
๐ ํ์ง๋ง ์ด ๋ฌธ์ ์์๋ ์ธ์ ํ๋ ฌ ๋ฐฉ์์ผ๋ก ํ๊ณผ ์ด์ ํตํด์ ๊ฐ์ ํด๋น ์ซ์๋ค์ด ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ์ด์ผ ํ๋ค.
์ธ๋ฑ์ค์ ๊ฐ์ ์ผ์น์ํค๊ธฐ ์ํด (n+1) * (n+1)์ ํ๋ ฌ์ ๋ฆฌ์คํธ๋ก ๋ง๋ค๊ณ 0์ ์ฑ์ด๋ค.
์ฐ๊ฒฐ๋ ์ซ์๋ค ๊ฐ์ m๊ฐ ์
๋ ฅ ๋ฐ์์ ํด๋น ํ๊ณผ ์ด์ ์ฐ๊ฒฐ์์ผ์ผ ํ๋ฏ๋ก 1๋ก ๋ฐ๊พผ๋ค.
์ฆ, ํ์ ์ซ์์ ์ด์ ์ซ์๊ฐ ์ฐ๊ฒฐ๋์ด ์์์ ํ์ํ๋ ๊ฒ์ด๋ค.
from collections import deque
n, m, v = map(int, input().split())
graph = [[0] * (n+1) for _ in range(n+1)]
for _ in range(m):
m1, m2 = map(int, input().split())
# ๋
ธ๋ ์ฐ๊ฒฐํ๊ธฐ
graph[m1][m2] = graph[m2][m1] = 1
## ๋๋น ์ฐ์ ํ์ (BFS)
def bfs(start_v):
visited = [start_v]
# ๋ฆฌ์คํธ๋ฅผ ์จ์ pop(0)ํ๋ฉด ์๊ฐ ๋ณต์ก๋ O(N)
# deque๋ฅผ ์จ์ popleft()ํ๋ฉด ์๊ฐ ๋ณต์ก๋ O(1)
queue = deque()
queue.append(start_v)
while queue:
v = queue.popleft()
print(v, end=' ')
for w in range(len(graph[start_v])):
if graph[v][w] == 1 and (w not in visited):
visited.append(w)
queue.append(w)
## ๊น์ด ์ฐ์ ํ์ (DFS)
def dfs(start_v, visited=[]):
visited.append(start_v)
print(start_v, end=' ')
for w in range(len(graph[start_v])):
if graph[start_v][w] == 1 and (w not in visited):
dfs(w, visited)
dfs(v)
print()
bfs(v)