어떤 나라에는 1 ~ N번까지의 도시와 M개의 단방향 도로가 존재합니다. 모든 도로의 거리는 1입니다. 이때 특정한 도시 X로부터 출발하여 도달할 수 있는 모든 도시 중에서, 최단 거리가 정확히 K인 모든 도시의 번호를 출력하는 프로그램을 작성하세요. 또한 출발 도시 X에서 출발 도시 X로 가는 최단 거리는 항상 0이라고 가정합니다.
문제에서 모든 도로의 거리는 1이다. 이는 다시 말해 모든 간선의 비용이 1이라는 의미인데, 그래프에서 모든 간선의 비용이 동일할 때는 너비 우선 탐색(BFS)을 이용하여 최단 거리를 찾을 수 있다. 다시 말해 '모든 도로의 거리는 1'이라는 조건 덕분에 너비 우선 탐색을 이용하여 간단히 해결할 수 있는 것이다.
문제의 조건을 살펴보면 노드의 개수 N은 최대 300,000개이며 간선의 개수 M은 최대 1,000,000개이다. 따라서 이 문제는 너비 우선 탐색을 이용하여 시간 복잡도 O(N+M)으로 동작하는 소스코드를 작성하여 시간 초과 없이 해결할 수 있다. 먼저 특정한 도시 X를 시작점으로 BFS를 수행하여 모든 도시까지의 최단 거리를 계산한 뒤에, 각 최단 거리를 하나씩 확인하며 그 값이 K인 경우에 해당 도시의 번호를 출력하면 된다.
from collections import deque
n, m, k, x = map(int, input().split())
graph = [[] for _ in range(n+1)]
# 모든 도로 정보 입력받기
for i in range(m):
a, b = map(int, input().split())
graph[a].append(b)
# 모든 도시에 대한 최단 거리 초기화
distance = [-1] * (n+1)
distance[x] = 0 # 출발 도시까지의 거리는 0으로 설정
# 너비 우선 탐색(BFS) 수행
queue = deque([x])
while queue:
now = queue.popleft()
# 현재 도시에서 이동할 수 있는 모든 도시를 확인
for next in graph[now]:
# 아직 방문하지 않은 도시라면
if distance[next] == -1:
# 최단 거리 갱신
distance[next] = distance[now] + 1
queue.append(next)
# 최단 거리가 K인 모든 도시의 번호를 오름차순으로 출력
check = False
for i in range(1, n+1):
if distance[i] == k:
print(i)
check = True
# 만약 최단 거리가 K인 도시가 없다면, -1 출력
if check == False:
print(-1)