어떤 문제를 푸는가
가중치가 음이 아닌 방향/무방향 그래프에서, 한 시작점 \(s\)로부터 모든
정점까지의 최단 거리를 구합니다. 간선 가중치가 모두 1이면 BFS로 충분하지만,
가중치가 제각각이면 "가까운 칸부터 차례로"라는 BFS의 전제가 깨집니다.
다익스트라는 이 일반화를 다룹니다.
핵심 아이디어
거리 배열 dist[v]를 모두 \(\infty\)로 두고 dist[s] = 0에서 시작합니다.
아직 확정되지 않은 정점 중 dist가 가장 작은 정점 \(u\)를 고르고, 그
정점을 통한 이완(relaxation)을 합니다.
$$ \text{dist}[v] \leftarrow \min(\text{dist}[v],\ \text{dist}[u] + w(u, v)) $$
한 번 "가장 작은 값으로 뽑힌" 정점은 다시 갱신되지 않습니다. 이 정점을
확정(finalize) 했다고 부릅니다.
왜 옳은가 (정당성 스케치)
귀류법으로 봅니다. 어떤 정점 \(u\)를 확정하는 순간 dist[u]가 실제 최단 거리가
아니라고 가정합시다. 그러면 더 짧은 경로 \(P\)가 존재합니다. \(P\)를 따라가다 보면
아직 확정되지 않은 첫 정점 \(x\) 가 있습니다. \(x\)의 직전 정점은 이미
확정되었으므로 dist[x]는 그 시점에 이완되어 있고, 가중치가 음이 아니므로
$$ \text{dist}[x] \le (\text{경로 } P \text{에서 } x \text{까지의 거리}) \le \text{dist}[u] $$
가 됩니다. 그렇다면 우리는 \(u\) 대신 \(x\)를 먼저 뽑았어야 하므로 모순입니다.
음이 아닌 가중치 가정이 바로 두 번째 부등식을 보장하는 열쇠입니다. 음수
간선이 있으면 이 논증이 무너지고, 그때는 벨만-포드를 써야 합니다.
자료구조와 복잡도
매번 "가장 작은 dist"를 찾는 일을 최소 힙(우선순위 큐) 으로 합니다.
각 간선은 최대 한 번 큐에 (key, 정점) 쌍을 넣으므로 큐 연산은 \(O(E)\)번,
각 연산이 \(O(\log E) = O(\log V)\) 이므로 전체는
$$ O(E \log V) $$
입니다. 정점 수가 적고 간선이 빽빽하면(\(E \approx V^2\)) 힙 없이 매번 선형
탐색하는 \(O(V^2)\) 구현이 오히려 빠를 수 있습니다.
흐름 한눈에 보기
| 단계 | 하는 일 |
|---|---|
| 초기화 | dist[s]=0, 나머지 \(\infty\), 큐에 (0, s) |
| 추출 | 큐에서 거리 최소 정점 \(u\)를 꺼낸다 |
| 게으른 검사 | 꺼낸 거리가 dist[u]보다 크면 버린다 |
| 이완 | \(u\)의 각 이웃 \(v\)에 대해 dist를 갱신하고 큐에 넣는다 |
여기서 게으른 삭제(lazy deletion) 가 중요합니다. 우선순위 큐는 임의 원소의
값을 직접 줄이기 어렵기 때문에, 갱신할 때마다 새 쌍을 그냥 넣고 꺼낼 때
"이미 더 좋은 값으로 확정된 정점"이면 무시합니다.
정리
- 음이 아닌 가중치 단일 시작점 최단 경로의 표준 해법.
- 정당성의 핵심은 "음이 아닌 가중치 → 먼저 뽑힌 정점이 최단 확정".
- 힙 기반 \(O(E \log V)\), 조밀 그래프는 \(O(V^2)\)도 고려.
- 다음 강의에서 실제 구현과 흔한 함정을 다룹니다.