코드
from collections import deque
# 슈퍼 기본 DFS & BFS
n, m, v = map(int, input().split())
# 리스트의 첫번째 요소는 빈 리스트 처리 => 인덱스 번호와 노드 번호를 통일시키기 위해서
# 따라서 n + 1 => 정점 개수 +1 만큼 반복해야함
graph = [[] for _ in range(n + 1)]
# 각 노드마다 방문 여부 체크할 리스트 선언
visited = [False] * (n + 1)
# 입력받은 노드와 간선간의 연결 정보를 노드별 인접리스로 표현
for _ in range(m):
# 간선이 연결하는 두 정점의 번호 입력
a, b = map(int, input().split())
# a와 b 노드가 연결돼어있다 = b와 a 노드가 연결돼어있다 (swap)
graph[a].append(b)
graph[b].append(a)
# 번확 작은 순서로 방문하기 때문에 sort()로 오름차순 정렬 시행
graph[a].sort()
graph[b].sort()
# DFS
def dfs(graph, v, visited):
# 시작 방문 처리 & 재귀적 호출 시 새로 받은 v번째 노드 방문처리
visited[v] = True
# 방문한 노드의 번호 출력
print(v, end = ' ')
# 처음 시작 노드의 번호 v부터 v에 연결되어있는 노드들을 반복하여 탐색 시작
for i in graph[v]:
# v번 노드의 방문 여부가 False이면
if not visited[i]:
# 재귀적으로 호출 => 스택 구현과 동일한 기능
dfs(graph, i, visited)
# BFS
def bfs(graph, v, visited):
# 방문 여부 리스트 초기화
visited = [False] * (n + 1)
# 방문 노드를 담을 queue 선언
queue = deque()
# 시작 노드 방문
queue.append(v)
# 시작 방문 처리 & 재귀적 호출 시 새로 받은 v번째 노드 방문처리
visited[v] = True
# 방문을 완료한 원소들을 queue에 넣고 queue에서 하나씩 순서대로 뽑아내면
# queue가 빌 것이고 그럴 경우 반복문 종료
while queue:
# 큐에서 LILO로 원소 출력
p = queue.popleft()
print(p, end=' ')
# 해당 요소와 연결된 미방문 노드들 큐에 삽입 후 방문처리
for i in graph[p]:
if not visited[i]:
queue.append(i)
visited[i] = True
dfs(graph, v, visited)
print()
bfs(graph, v, visited)
댓글남기기