コース一覧
コンピューターサイエンス上級:アルゴリズムとデータ構造
ダイクストラ法 — 重み付きグラフの最短経路

コンピューターサイエンス上級:アルゴリズムとデータ構造

探索、ソート、木、グラフ、動的計画法、貪欲法など、競技プログラミングや技術面接で問われる高度なアルゴリズムとデータ構造を学べるコースです。基本的な CS の知識を持ち、アルゴリズム力を伸ばしたい学習者や、外資・大手の技術面接対策をしたい方を対象としています。約 13 時間 (1 日 30 分 × 26 日) で 50 レッスンを修了でき、修了後はコーディング面接の実装問題を構造的に解けるようになります。

1
連結リスト
0. リンクリスト構築と長さの計算5分
1. リンクリストの反転5分
2. リンクリストのサイクル検出5分
3. ソート済みリンクリストの merge5分
4. リンクリストの中央ノード取得5分
5. ソート済みリストの重複削除5分
6. 第1章まとめクイズ5分
2
二分木
0. 二分木の in-order 走査5分
1. 二分木の pre-order 走査5分
2. 二分木の post-order 走査5分
3. 二分木の幅優先走査 (BFS)5分
4. 二分木の高さ5分
5. 二分木の平衡判定5分
6. 第2章まとめクイズ — 二分木5分
3
探索木 (BST)
0. BST に値を挿入する5分
1. BST から値を検索する5分
2. BST の最小値と最大値5分
3. BST 妥当性チェック5分
4. BST で k 番目に小さい値5分
5. BST から値を削除する5分
6. 第 3 章 まとめクイズ5分
4
ハッシュとセット
0. hashmap で頻度集計5分
1. キーでグループ化5分
2. two sum (hash で O(n))5分
3. 部分配列の和 = k の個数5分
4. 最長連続部分列5分
5. 集合の積 (intersection)5分
6. 第4章まとめクイズ5分
5
グラフ
0. グラフ BFS で連結成分サイズを求める5分
1. グラフ DFS で連結成分の数を数える5分
2. グラフのパス存在判定5分
3. BFS で最短経路の長さを求める5分
4. トポロジカルソート5分
5. 2 部グラフ判定5分
6. ダイクストラ法 — 重み付きグラフの最短経路15分
7. 第5章まとめクイズ — グラフ5分
6
動的計画法 (上級)
0. 編集距離 (レーベンシュタイン距離)5分
1. 最長増加部分列(LIS)の解法 ── AOJ 2430 対応の動的計画法5分
2. 最大部分配列和 (Kadane)5分
3. 隣り合わない最大値 (House Robber)5分
4. グリッド経路数 (Unique Paths)5分
5. 単語分割可能か (Word Break)5分
6. 第6章まとめクイズ — 動的計画法 (上級)5分
7
総合データ構造と関数型
0. map と filter を組み合わせる5分
1. reduce で積を計算5分
2. 関数合成5分
3. カリー化5分
4. trie の単純検索 (prefix マッチ)5分
5. Union-Find (連結成分数)5分
6. 最終総まとめクイズ5分

コンピューターサイエンス上級:アルゴリズムとデータ構造

01リンクリスト構築と長さの計算
02リンクリストの反転
03リンクリストのサイクル検出
04ソート済みリンクリストの merge
05リンクリストの中央ノード取得
06ソート済みリストの重複削除
07第1章まとめクイズ
08二分木の in-order 走査
09二分木の pre-order 走査
10二分木の post-order 走査
11二分木の幅優先走査 (BFS)
12二分木の高さ
13二分木の平衡判定
14第2章まとめクイズ — 二分木
15BST に値を挿入する
16BST から値を検索する
17BST の最小値と最大値
18BST 妥当性チェック
19BST で k 番目に小さい値
20BST から値を削除する
21第 3 章 まとめクイズ
22hashmap で頻度集計
23キーでグループ化
24two sum (hash で O(n))
25部分配列の和 = k の個数
26最長連続部分列
27集合の積 (intersection)
28第4章まとめクイズ
29グラフ BFS で連結成分サイズを求める
30グラフ DFS で連結成分の数を数える
31グラフのパス存在判定
32BFS で最短経路の長さを求める
33トポロジカルソート
342 部グラフ判定
35ダイクストラ法 — 重み付きグラフの最短経路
36第5章まとめクイズ — グラフ
37編集距離 (レーベンシュタイン距離)
38最長増加部分列(LIS)の解法 ── AOJ 2430 対応の動的計画法
39最大部分配列和 (Kadane)
40隣り合わない最大値 (House Robber)
41グリッド経路数 (Unique Paths)
42単語分割可能か (Word Break)
43第6章まとめクイズ — 動的計画法 (上級)
44map と filter を組み合わせる
45reduce で積を計算
46関数合成
47カリー化
48trie の単純検索 (prefix マッチ)
49Union-Find (連結成分数)
50最終総まとめクイズ

コンピューターサイエンス上級:アルゴリズムとデータ構造

ダイクストラ法 — 重み付きグラフの最短経路

遠回りのほうが速いことがある

前のレッスンでは、辺 1 本を 1 歩と数えて最短の歩数を求めました。現実の地図はそうなっていません。同じ 1 本の道でも、5 分の道と 40 分の道があります。

diagram (will load when visible)

出発から B へは、直通なら辺 1 本で 4 かかります。A を経由すると辺は 2 本になりますが 1 + 2 = 3 です。乗り換えが増えるほうが安い。辺の本数で測る幅優先探索は、ここで間違えます。近い順に広げるという前提そのものが、重みが入った瞬間に成り立たなくなるからです。

辺に重みが付いた最短経路を求めるのがダイクストラ法です。カーナビも、ルーターの経路計算も、配送順の計算も、根っこはこれです。

一番安い未確定を確定する

各点に「今わかっている最小のコスト」を持たせます。出発点は 0、ほかは無限大から始めます。

繰り返すのは次の 2 つだけです。

  1. まだ確定していない点のうち、コストが一番小さい点を選んで確定する
  2. 確定した点の隣を見て、「確定した点のコスト + 辺の重み」が隣の今の値より小さければ、その値に書き換える

上の図で追ってみます。最初に確定するのは出発点で 0。隣を見て A が 1、B が 4 になります。未確定で一番小さいのは A の 1 なので A を確定。A の隣を見て B が 1 + 2 = 3 に下がり、C が 1 + 5 = 6 になります。次に確定するのは B の 3。B の隣を見て C が 3 + 1 = 4 に下がります。次は C の 4 で、目的地が 4 + 3 = 7。

大事なのは、一度確定した点の値はもう変わらない ことです。未確定のなかで一番安い点に、これ以上安い行き方があるとしたら、それは今より高い点を経由することになります。重みが 0 以上なら、経由するほど高くなるので、安くなりようがありません。だから目的地を確定した瞬間に、そこで止めて答えを返せます。

負の重みがあると、確定が嘘になる

この「安くなりようがない」は、重みが 0 以上だから言えることです。マイナスの辺が 1 本でもあると崩れます。

出発から A への重みが 3、出発から B への重みが 2、A から B への重みが -2 だとします。ダイクストラ法は、未確定で最小の B を先に 2 で確定します。ところが実際は、遠回りして A を通ると 3 + (-2) = 1 で着けます。確定したあとに、もっと安い道が出てきてしまいました。

マイナスの重みは、値引きや払い戻しを辺に載せたときに出てきます。そういうときはベルマン・フォード法という別の道具を使います。

解説

重みが無いなら幅優先探索、重みがあるならダイクストラ法、マイナスが混じるならベルマン・フォード法。この 3 段で覚えておくと迷いません。

やってみよう

  • 上の図で、目的地までの最小コストが 7 になることを手で確かめる
  • A から C への辺を 5 から 2 に変えると、通る道はどう変わるか
  • 全部の辺の重みを 1 に揃えると、答えが「歩数」と一致することを確かめる
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • 第5章まとめクイズ — グラフ

    BFS / DFS / 最短経路 / トポロジカルソート / 2 部グラフ判定について理解度を確認する 4 択クイズ。

  • 編集距離 (レーベンシュタイン距離)

    2 つの文字列を一致させるために必要な最小編集回数を、二次元 DP で求める古典問題に挑戦します。

  • map と filter を組み合わせる

    配列に対して `map` と `filter` を組み合わせ、偶数だけを 2 倍した結果を返す関数を実装する。関数型プログラミングの基礎を学ぶ。

分からないところは Tap (AI先生) に質問できます

24 時間いつでも、あなたのレベルに合わせて日本語で答えます。