[PS] BOJ 24445 / 알고리즘 수업 - 너비 우선 탐색 2

[PS] BOJ 24445 / 알고리즘 수업 - 너비 우선 탐색 2
문제 링크: https://www.acmicpc.net/problem/24445
Thumbnail: Photo by Aaron Burden (Unsplash)

그래프를 탐색하는 2가지 기초적인 방법인 DFS와 BFS, 그중 BFS(너비 우선 탐색) 에 대한 문제입니다.

풀이

문제에서도 의사 코드로 주었듯이, BFS(너비 우선 탐색)은 자식 노드보다 형제 노드를 먼저 순회하는 방식입니다. 큐를 활용하면 간단히 구현할 수 있습니다!

문제에서 결과로 출력해야 하는 내용은 각 정점이 몇 번째 순서에 방문되었나 이므로, visited 배열을 bool 타입으로 저장하는 대신 방문 순서를 저장하게끔 구현했습니다.

전체 코드

from sys import stdin

N, M, R = map(int, stdin.readline().split())
visited = [0 for _ in range(N + 1)]             # 방문 여부 리스트. 정점은 1부터 N까지 존재하므로 N+1 크기로 초기화.

graph = [[] for _ in range(N + 1)]                  # 인접 리스트. 정점은 1부터 N까지 존재하므로 N+1 크기로 초기화.
for _ in range(M):
    u, v = map(int, stdin.readline().split())
    graph[u].append(v)                              # u에서 v로 가는 간선 추가
    graph[v].append(u)                              # v에서 u로 가는 간선 추가 (무향 그래프이므로 양방향)

for edges in graph:
    edges.sort(reverse=True)                        # 인접 리스트를 내림차순으로 정렬하여 DFS 순서를 결정한다.

visited[R] = 1                                      # 시작 정점 R을 방문 처리.
queue = [R]                                         # BFS를 위해 방문 예정 정점 큐를 초기화.
order = 2
while queue:
    node = queue.pop(0)                             # 큐에서 정점 하나를 꺼낸다.
    for n in graph[node]:
        if visited[n] == 0:
            visited[n] = order                      # 정점 n을 방문 처리.
            queue.append(n)                         # 정점 n을 큐에 추가.
            order += 1

for i in range(1, N + 1):
    print(visited[i])                               # 방문 순서 출력. visited[i]는 정점 i의 방문 순서.

solution.py