에듀테크 프로젝트 대시보드
다익스트라 최단 경로 (Dijkstra)
간선마다 비용(가중치)이 다른 그래프에서 한 출발점으로부터 모든 곳까지의 최소 비용을 구하는 알고리즘이다.
핵심은 탐욕적 확정 — 아직 확정되지 않은 노드 중 현재까지 거리가 가장 짧은 노드를 우선순위 큐에서 꺼내
"이 값이 최종값"으로 못 박고(확정), 그 이웃들의 거리를 완화(relax)한다.
한 번 확정된 노드는 다시 보지 않으므로, 음수 간선이 없을 때만 정답을 보장한다.
아래 격자에서 숫자는 그 칸에 들어가는 비용이다. BFS는 칸 수만 세지만, 다익스트라는 비용의 합을 최소화한다.
칸을 클릭하면 벽이 되고, S(초록)·E(빨강) 태그를 드래그하듯 클릭해 출발/도착을 옮길 수 있어요 — S를 먼저 클릭한 뒤 빈 칸을 클릭하면 출발점이 이동합니다.
import heapq def dijkstra(graph, start): # graph[u] = [(v, weight), ...] dist = {start: 0} pq = [(0, start)] # (지금까지 거리, 노드) while pq: d, u = heapq.heappop(pq) # 거리가 가장 짧은 노드를 꺼내 확정 if d > dist.get(u, float('inf')): continue # 이미 더 짧은 경로로 확정된 낡은 항목 for v, w in graph[u]: nd = d + w if nd < dist.get(v, float('inf')): dist[v] = nd # 완화(relax): 더 짧은 길 발견 heapq.heappush(pq, (nd, v)) return dist
벨만-포드나 SPFA를 써야 한다.O(log V)에 찾아, 전체 O((V+E) log V).u == goal일 때 즉시 종료해도 된다. 여기에 휴리스틱을 더하면 A*가 된다.| 구분 | BFS | 다익스트라 |
|---|---|---|
| 간선 비용 | 모두 동일(1) | 서로 다름 (≥ 0) |
| 자료구조 | 일반 큐 (FIFO) | 우선순위 큐 (최소 힙) |
| 최적 기준 | 간선(칸) 개수 최소 | 비용 합 최소 |
| 시간복잡도 | O(V+E) | O((V+E) log V) |