from collections import deque
N, M, V = map(int, input().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
a, b = map(int, input().split())
graph[a].append(b)
graph[a].sort()
graph[b].append(a)
graph[b].sort()
def dfs(graph, v, visited):
visited[v] = True
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
visited = [False] * (N+1)
dfs(graph, V, visited)
print()
def bfs(graph, start, visited):
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
visited = [False] * (N+1)
bfs(graph, V, visited)
# 4 5 1
# 1 2
# 1 3
# 1 4
# 2 4
# 3 4
# 1000 1 1000
# 999 1000
# 5 5 3
# 5 4
# 5 2
# 1 2
# 3 4
# 3 1
이코테 책에서 보고 DFS 와 BFS 기본 탐색 구현을 해봤음에도 잠깐 당황스러웠다.
푸는데까지 그리 오래 걸리진 않았다.
책으로 볼때는 쉬워보여도 막상 직접 구현해보려고하면 좀 막히는느낌이다.
아직익숙하지 않아서겠지.
기본적으로 DFS 는 스택, BFS 는 큐를 사용하고
재귀호출구조가 stack 에 호출을 쌓는 구조기 때문에 dfs 는 재귀호출로 구현하면 간단하다.
bfs 는 큐를 이용하면 간단히 구현할수 있는데, 파이썬에서는 deque 를 사용하면 된다.
위 구현은 인접리스트 방식으로 구현하였고 인접리스트는 graph 의 각 인덱스에 인덱스번호에 해당하는 노드(정점)와 연결된 노드번호를 저장하는것이다.
dfs 와 bfs 모두 방문처리가 중요하고 방문처리를 해줘야 재탐색하지 않는다.