문제
- 1 ~ n까지의 도시와 m개의 단방향 도로는 1 이다.
- 특정 도시 x부터 출발하여 도달할 수 있는 모든 도시 중에서,
- 최단 거리가 정확히 k인 모든 도시들의 번호를 출려하는 프로그램 작성하는 문제이다.
입력
- n : 도시의 개수 ( 2 <= n <= 300000 )
- m : 도로의 개수 ( 1 <= m <= 1000000 )
- k : 거리 정보 ( 1 <= k <= 300000 )
- x : 출발 도시의 번호 ( 1 <= x < n )
- m 개의 단방향 도시 정보 (a b, a에서 b로 가는 단방향 도로가 존재)
문제 접근 방법
- 우선순위 큐를 이용한 다익스트라 알고리즘을 이용하여
x번 도시에서 출발하여 다른 모든 도시로 가는 최단 경로를 distance 리스트에 저장하고
distance 리스트를 이용하여 x번 도시에서 거리가 k인 도시의 번호를 출력한다.
- 다익스트라 알고리즘을 공부하면 별 다른 응용없이 다익스트라 알고리즘을 이용해서 풀 수 있다.
코드
import sys
import heapq
n, m, k, x = map(int, sys.stdin.readline().split())
graph = [[] for _ in range(n + 1)]
for _ in range(m):
a, b = map(int, sys.stdin.readline().split())
graph[a].append((b, 1))
INF = int(1e9)
distance = [INF] * (n + 1)
def dijkstra(start):
distance[start] = 0
heap = []
heapq.heappush(heap, (0, start))
while heap:
dist, now = heapq.heappop(heap)
if distance[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(heap, (cost, i[0]))
dijkstra(x)
flag = False
for i in range(1, n + 1):
if distance[i] == k:
flag = True
print(i)
if flag == False:
print(-1)
참고자료