← ブログ一覧

ダイクストラ法をわかりやすく解説 - 最短経路アルゴリズム

ダイクストラ最短経路グラフ優先度キューAlgoNote

ダイクストラ法とは?

ダイクストラ(Dijkstra)法は、重み付きグラフで一つの開始ノードからすべての他のノードへの最短経路を求めるアルゴリズムです。1956年にエドガー・ダイクストラが考案し、カーナビの経路探索がまさにこのアルゴリズムの応用です。


なぜ重要か?

ダイクストラ法はコーディングテストと実務の両方で核心的なアルゴリズムです。

  • 実務活用: カーナビ、ネットワークルーティング、ゲームAI経路探索
  • コーディングテスト頻出: Google、Amazon、日本の大手IT企業で出題頻度が高い
  • 拡張性: ベルマンフォード、A*アルゴリズムなど高度なアルゴリズムの基盤

動作原理

ダイクストラ法は貪欲法(Greedy)戦略を使用します。各ステップで、現時点で発見された最短距離が最も短いノードを選択します。

ステップ1. 開始ノードの距離を0、残りを無限大で初期化します。

ステップ2. 未訪問ノードの中で距離が最も短いノードを選択します。

ステップ3. 選択したノードの隣接ノードの距離を更新します。

  • 新距離 = 現在のノード距離 + 辺の重み
  • 新距離 < 既存距離なら更新

ステップ4. すべてのノードを訪問するまでステップ2〜3を繰り返します。


時間計算量

実装方式時間計算量
配列探索O(V²)
優先度キュー(ヒープ)O((V + E) log V)

ノードが多い場合は必ず優先度キュー(最小ヒープ)を使用する必要があります。優先度キューを使えば「距離が最短のノード」をO(log V)で取り出せます。

優先度キューの可視化 →


核心的な制約条件

負の重みがある場合は使用できません。 ダイクストラ法は、一度確定した最短距離が変わらないという仮定(貪欲法)に基づいています。負の重みがあるとこの仮定が崩れます。

負の重みがあるグラフではベルマンフォードアルゴリズムを使用します。

ベルマンフォードの可視化 →


他の最短経路アルゴリズムとの比較

アルゴリズム負の重み時間計算量用途
ダイクストラ不可O((V+E) log V)単一始点
ベルマンフォード可能O(V × E)単一始点 + 負の重み
フロイド-ワーシャル可能O(V³)全ペア最短経路

実践テクニック

  • 優先度キューから取り出したノードの距離が確定済み距離より大きければスキップ(時間節約)
  • 経路復元が必要なら、prev配列に前のノードを記録
  • 2次元グリッドでも座標をノードに変換して適用可能

AlgoNoteで直接確認しましょう

ダイクストラ法がノードを一つずつ確定しながら最短距離を更新していく過程を、AlgoNoteで視覚的に確認できます。グラフの重みを変えて、経路がどう変わるか実験してみてください。

ダイクストラの可視化へ →

ダイクストラ法をわかりやすく解説 - 最短経路アルゴリズム - AlgoNote | 알고노트(AlgoNote)