양방향 그래프가 주어진다. 시작 노드에서 시작해 DFS, BFS를 통해 탐색한 경로를 출력한다.
node_num, edge_num, start = map(int, input().split())
nodes = [[] for _ in range(node_num+1)]
for _ in range(edge_num):
tail, head = map(int, input().split())
nodes[tail].append(head)
nodes[head].append(tail)
# 양방향 그래프 생성
visited_DFS = [False]*(node_num+1)
visited_BFS = [False]*(node_num+1)
stack = [start]
queue = [start]
DFS = []
BFS = []
for node in nodes:
node.sort(reverse=True)
visited_cnt = 0
while stack:
cur_node = stack.pop(-1)
# LIFO로 가장 최근에 들어간 노드의 인접 노드 탐색
if not visited_DFS[cur_node]:
visited_DFS[cur_node] = True
visited_cnt += 1
DFS.append(cur_node)
# 이 노드가 탐색한 적이 없다면 방문하고 카운트
if visited_cnt == node_num: break
# 모든 노드를 방문했다면 탈출
for next_node in nodes[cur_node]:
if not visited_DFS[next_node]:
# 노드 번호가 작은 순서대로 방문.
# 앞에서 reverse 정렬했기 때문에 인접 노드 중 가장 작은 노드가 '나중'에 push된다.
stack.append(next_node)
for node in nodes:
node.sort()
while queue:
cur_node = queue.pop(0)
# FIFO로 들어간 순서대로 인접 노드 확인한다.
BFS.append(cur_node)
visited_BFS[cur_node] = True
for next_node in nodes[cur_node]:
if not visited_BFS[next_node]:
# 인접 노드 중 방문한 적이 없는 노드만 따로 방문한다.
queue.append(next_node)
# 노드 번호가 작은 순서대로 들어가고, 들어간 순서대로 pop되기 때문에 작은 번호를 먼저 탐색한다.
visited_BFS[next_node] = True
for node in DFS:
print(node, end=' ')
print()
for node in BFS:
print(node, end=' ')