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)