49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
# 택배 배송
|
|
|
|
import sys
|
|
import heapq as h
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def solution():
|
|
n, m = map(int, input().rstrip().split())
|
|
|
|
g = {i+1: [] for i in range(n)}
|
|
dk = [float('inf') for _ in range(n+1)]
|
|
|
|
for _ in range(m):
|
|
v, w, k = map(int, input().rstrip().split())
|
|
g[v].append((k, w))
|
|
g[w].append((k, v))
|
|
|
|
heap = []
|
|
h.heappush(heap, (0, 1))
|
|
dk[1] = 0
|
|
while heap:
|
|
now_dist, now_v = h.heappop(heap)
|
|
|
|
if now_dist > dk[now_v]:
|
|
continue
|
|
|
|
for nxt_k, nxt_v in g[now_v]:
|
|
new_dist = dk[now_v]+nxt_k
|
|
if new_dist < dk[nxt_v]:
|
|
dk[nxt_v] = min(dk[nxt_v], dk[now_v]+nxt_k)
|
|
h.heappush(heap, (new_dist, nxt_v))
|
|
|
|
print(dk[n])
|
|
|
|
return
|
|
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 47분
|
|
|
|
시간 복잡도: 간선만큼 진행하는데 이때 heap 정렬이 매번 일어나기 때문에 O(mlogn)이다.
|
|
|
|
해설: 시작지점에서 끝지점까지의 가중치에 따른 최단거리를 구하는 것이기 때문에 다익스트라를 활용하면 된다.
|
|
현재 노드에서 다음 노드까지의 최단거리가 아니라 전체 다익스트라 결과에서 가장 최단거리인 노드로 다시 시작을 하는 것이었다.
|
|
이렇게 진행하면 visited를 쓰지 않아도, heap에 중복된 노드가 들어갈 수 있지만 거리가 먼 것은 배제하기 때문에 지장이 없다.
|
|
""" |