n(1≤n≤1,000)개의 도시가 있다. 그리고 한 도시에서 출발하여 다른 도시에 도착하는 m(1≤m≤100,000)개의 버스가 있다. 우리는 A번째 도시에서 B번째 도시까지 가는데 드는 버스 비용을 최소화 시키려고 한다. 그러면 A번째 도시에서 B번째 도시 까지 가는데 드는 최소비용과 경로를 출력하여라. 항상 시작점에서 도착점으로의 경로가 존재한다.
[입력]
첫째 줄에 도시의 개수 n(1≤n≤1,000)이 주어지고 둘째 줄에는 버스의 개수 m(1≤m≤100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 그리고 그 다음에는 도착지의 도시 번호가 주어지고 또 그 버스 비용이 주어진다. 버스 비용은 0보다 크거나 같고, 100,000보다 작은 정수이다.
그리고 m+3째 줄에는 우리가 구하고자 하는 구간 출발점의 도시번호와 도착점의 도시번호가 주어진다.
[출력]
첫째 줄에 출발 도시에서 도착 도시까지 가는데 드는 최소 비용을 출력한다.
둘째 줄에는 그러한 최소 비용을 갖는 경로에 포함되어있는 도시의 개수를 출력한다. 출발 도시와 도착 도시도 포함한다.
import sys
import heapq
sys.stdin=open('input.txt', 'r')
input = sys.stdin.readline
def dijkstra(start):
Q = []
distance[start] = 0
heapq.heappush(Q,(0, start))
while Q:
wei, now = heapq.heappop(Q)
if distance[now] < wei:
continue
for next_node, w in graph[now]:
next_wei = w + wei
if next_wei < distance[next_node]:
distance[next_node] = next_wei
heapq.heappush(Q,(next_wei,next_node))
prev_node[next_node] = now
return distance, prev_node
if __name__=='__main__':
N = int(input())
M = int(input())
#가중치 테이블 distance
INF = sys.maxsize
distance = [INF]*(N+1)
graph = [[] for _ in range(N + 1)]
prev_node = [0]*(N+1)
#초기화
for _ in range(M):
u, v, w = map(int, input().split())
# 시작 노드 (가중치, 목적지 노드) 형태로 저장
graph[u].append((v, w))
#시작점 K
start, end = map(int, input().split())
distance, prev_node = dijkstra(start) # 시작점을 기준으로 각 노드까지 최단거리를 distance에 저장
print(distance[end]) # 최소 비용
path = [end]
cur = end
while cur != start:
cur = prev_node[cur]
path.append(cur)
path.reverse()
print(len(path)) # 최소 비용 경로의 도시 수
print(' '.join(map(str, path))) # 최소 비용 경로의 도시들