어떤 나라에는 1 ~ N번까지의 도시와 M개의 단방향 도로가 존재한다.
모든 도로의 거리는 1이다.
특정한 도시 X로부터 출발하여 도달할 수 있는 모든 도시 중에서, 최단거리가 정확히 K인 모든 도시의 번호를 출력하는 프로그램을 작성하라.
N = 4, K = 2, X = 1일 때 다음과 같이 그래프가 구성되어 있다고 한다.
이때 1번 도시에서 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 2인 도시는 4번 도시뿐이다.
2번과 3번 도시의 경우, 최단거리가 1이기 때문에 출력하지 않는다.
입력조건
첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어집니다.
(2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N)
둘째 줄부터 M개의 줄에 걸쳐서 두 개의 자연수 A, B가 주어지며, 각 자연수는 공백으로 구분합니다.
이는 A번 도시에서 B번 도시로 이동하는 단방향 도로가 존재한다는 의미입니다. (1 ≤ A, B ≤ N)
단, A와 B는 서로 다른 자연수입니다.
출력조건
X로부터 출발하여 도달할 수 있는 도시 중에서, 최단 거리가 K인 모든 도시의 번호를 한 줄에 하나씩 오름차순으로 출력합니다.
이때 도달할 수 있는 도시 중에서 최단 거리가 K인 도시가 하나도 존재하지 않으면 -1
을 출력합니다.
from collections import deque
#도시의 개수, 도로의 개수, 거리 정보, 출발 도시 번호
n, m, k, x = map(int, input().split())
graph = [[] for _ in range(n + 1)]
#모든 도로 정보 입력받기
for _ in range(m):
a, b = map(int, input.split())
graph[a].append(b)
#모든 도시에 대한 최단 거리 초기화
#리스트 반복하기 [-1] * (n+1) = [-1, -1 ... , -1]
distance = [-1] * (n + 1)
distance[x] = 0 #출발 도시까지의 거리는 0으로 설정
#너비 우선 탐색(BFS) 수행
q = deque([x])
while q:
now = q.popleft()
#현재 도시에서 이동할 수 있는 모든 도시를 확인
for next_node in graph[now]:
#아직 방문하지 않은 도시라면
if distance[next_node] == -1:
#최단거리 갱신
distance[next_node] = distance[now] + 1
q.append(next_node)
#최단 거리가 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)
4 4 2 1
1 2
1 3
2 3
2 4