[백준 11779] 최소비용 구하기 2 python
업데이트:
문제 이해
방향 가중치 그래프에서 최단경로를 찾는 문제.
최단거리(비용)만 구하면 되는 것이 아닌 그 경로 또한 찾아야 한다.
접근
다익스트라로 최소비용을 구하는 동시에 경로를 기록하기 위해 거리가 갱신될 때 어떤 노드에서 왔는지 기록해준다.
정답 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import sys
from heapq import *
input = sys.stdin.readline
INF = int(1e9)
n = int(input())
graph = [[] for _ in range(n+1)] # 도시 번호는 1부터 시작
for _ in range(int(input())):
u, v, c = map(int, input().split())
graph[u].append((v, c)) # 방향 그래프
departures, arrivals = map(int, input().split())
# Dijkstra
dist = [INF for _ in range(n+1)]
prev = [-1 for _ in range(n+1)]
dist[departures] = 0
hq = []
heappush(hq, (0, departures))
while hq:
cur_dist, cur = heappop(hq)
if dist[cur] < cur_dist: continue
for nx, nx_dist in graph[cur]:
if dist[nx] > cur_dist + nx_dist:
dist[nx] = cur_dist+nx_dist
heappush(hq, (dist[nx], nx))
prev[nx] = cur # cur -> nx를 기록해 이후 역추적
# 경로 추적
route = [arrivals]
cur = arrivals
while prev[cur] != -1:
route.append(prev[cur])
cur = prev[cur]
# Print result
print(dist[arrivals])
print(len(route))
print(*route[::-1]) # 역순으로 출력해야함
댓글남기기