이번 문제는 다익스트라 알고리즘을 통해 해결하였다. 다익스트라 알고리즘으로 접근하여 제출하였지만 시간 초과가 발생하여 input을 sys.stdin.readline으로 변경하고, sys.maxsize를 dist 리스트에 매번 넣는것이 아닌, INF 변수에 sys.maxsize값을 저장하여 dist 리스트에 INF를 넣어 보았다. 이러한 방식으로 코드를 수정하여 제출하니 통과할 수 있었다.
출발 도시에서부터의 각 도시의 거리를 저장하는 리스트 dist를 최대값으로 채운 뒤에 출발 도시에 해당하는 dist는 0으로 갱신해주고, 다익스트라 알고리즘을 통해 각 도시까지의 최단 거리를 구하였다. 최단 거리를 구하는 도중에 현재의 거리가 k와 같다면 정답 리스트에 바로 추가해주었다.
sys.stdin.readline
로 저장한다.graph[a]
에 (b, 1)
을 넣는다.sys.maxsize
를 저장한다.dist[x]
를 0으로 갱신한다.(0, x)
를 넣어준다. (0은 현재까지의 거리, x는 현재의 위치)dist[cur]
보다 클 경우, 다음 반복으로 넘어간다.graph[cur]
을 순회하는 nxt, dst에 대한 for문을 돌린다.distance+dst
를 저장한다.dist[nxt]
가 더 클 경우,dist[nxt]
를 cost로 갱신한다.(cost, nxt)
를 넣어준다.import heapq
import sys
input=sys.stdin.readline
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))
results=[]
INF=sys.maxsize
dist=[INF for _ in range(n+1)]
dist[x]=0
q=[]
heapq.heappush(q, (0, x))
while q:
distance, cur=heapq.heappop(q)
if distance>dist[cur]:
continue
if distance==k:
results.append(cur)
for nxt, dst in graph[cur]:
cost=distance+dst
if cost<dist[nxt]:
dist[nxt]=cost
heapq.heappush(q, (cost, nxt))
if not results:
print(-1)
else:
for i in results:
print(i)