코드
import sys
import heapq
input = sys.stdin.readline
n = int(input())
m = int(input())
graph = [[] for _ in range(n+1)]
dist = [10e9]*(n+1)
ans = sys.maxsize
for _ in range(m):
start, end, cost = map(int, input().split())
graph[start].append((end, cost))
def dijkstra(start):
q = []
heapq.heappush(q, (0, start))
dist[start] = 0
while q:
d, now = heapq.heappop(q)
if dist[now] < d:
continue
for adj in graph[now]:
cost = d + adj[1]
if cost < dist[adj[0]]:
dist[adj[0]] = cost
heapq.heappush(q, (cost, adj[0]))
st, e = map(int, input().split())
dijkstra(st)
print(dist[e])
결과
풀이 방법
다익스트라 알고리즘
을 사용하는 문제이다
- 다익스트라 알고리즘은 노드 간 음의 비용이 존재하지 않을 때
시작 노드(start)로부터 각 노드까지의 최소 비용
을 구하는 데 유용하다
- 노드를 방문할 때마다 최소비용을 갖는 인접 노드를 선택해야 하는데 이때 최소힙을 사용하면 O(1)의 시간복잡도로 선택할 수 있다.
- 인접 노드를 방문하고 heappush 연산을 할 때마다 O(logN)의 시간이 소요된다
- 따라서 최대 N개 노드를 방문하므로 다익스트라 알고리즘의 시간복잡도는
O(NlogN)
이다