- 시작점에서 종점까지의 최단 경로를 찾는 알고리즘
- 현재까지 가중치 + 추가 가중치 합산이 목적지의 가중치 합산 값보다 작을 때만 갱신한다.
- 간선의 가중치가 음이 아닌 경우에만 사용 가능하다

백준 1916
리스트 갱신
import sys
input = sys.stdin.readline
def dijkstra(start, end):
dist = [987654321] * (N + 1)
dist[start] = 0
visited = [False] * (N + 1)
for _ in range(1, N + 1):
min_idx = -1
min_value = 987654321
for i in range(1, N + 1):
if not visited[i] and dist[i] < min_value:
min_idx = i
min_value = dist[i]
if min_idx == -1:
break
visited[min_idx] = True
for i in range(1, N + 1):
if not visited[i] and dist[i] > adj[min_idx][i] + dist[min_idx]:
dist[i] = adj[min_idx][i] + dist[min_idx]
return dist[end]
N = int(input())
M = int(input())
adj = [[987654321] * (N + 1) for _ in range(N + 1)]
for _ in range(M):
start, end, w = map(int, input().split())
if w < adj[start][end]:
adj[start][end] = w
start, end = map(int, input().split())
print(dijkstra(start, end))
힙큐
import sys
import heapq
input = sys.stdin.readline
def dijkstra(start, end):
dist = [987654321] * (N + 1)
visited = set()
heap = []
heapq.heappush(heap, (0, start))
while heap:
distance, node = heapq.heappop(heap)
if node not in visited:
dist[node] = distance
visited.add(node)
for destination in range(N + 1):
if destination not in visited and dist[destination] > adj[node][destination] + dist[node]:
heapq.heappush(heap, (adj[node][destination] + dist[node], destination))
return dist[end]
N = int(input())
M = int(input())
adj = [[987654321] * (N + 1) for _ in range(N + 1)]
for _ in range(M):
start, end, w = map(int, input().split())
if w < adj[start][end]:
adj[start][end] = w
start, end = map(int, input().split())
print(dijkstra(start, end))