令和6年度 春期 応用情報技術者試験 午後 問3 ダイクストラ法による最短経路探索
テクノロジアルゴリズム
この問題は2024(R6)春 応用情報技術者 午後に出題されたものです。出題時点の法令・制度に基づく内容のため、現行の内容と一致しない場合があります。
本ページの問題文・選択肢は、原本の体裁を Web 表示用に正規化しています(改行・記号・数式・図表参照の調整)。設問の趣旨および正解に影響する変更は加えていません。
学習ガイド
ダイクストラ法を題材にしたアルゴリズムの問題で、最短距離を求める手順のトレース、プログラムの穴埋め、最短経路の出力機能の追加、計算量の考察までを一続きに問います。距離が確定したノードを選んで隣接ノードの距離を更新するという基本動作を、表と擬似言語の両方で正確に追えるかが試されます。この記事では小さなグラフの手計算トレースから始めて、各空欄の式が持つ意味を順に確認していきます。
この記事で押さえる論点
- ダイクストラ法の距離更新の手順を表のトレースで再現する
- プログラムの空欄を確定ノード選択・距離比較の処理から埋める
- 経路復元のための変数追加と計算量のオーダーを考察する
出題情報
- 出題
- 2024(R6)春 応用情報技術者 午後 問3
- 配点
- 20点満点
- 模範解答
- 公表(設問ごとに掲載)
出題趣旨・採点講評(IPA 公表)
交通機関の経路検索を始め,最短経路問題に帰着するアルゴリズムを活用する機会がますます広がっている。本問では,動的計画法の一種であるダイクストラ法を題材として,グラフにおける最短経路探索についての基礎知識,実装方法及びアルゴリズムの効率についての理解を問う。
問3では,動的計画法の一種であるダイクストラ法を題材に,グラフにおける最短経路探索に関する基礎知識,実装方法及びアルゴリズムの効率に関する理解について出題した。全体として正答率は平均的であった。
問題本文
問3 グラフのノード間の最短経路を求めるアルゴリズムに関する次の記述を読んで,設問に答えよ。
グラフ内の二つのノード間の最短経路を求めるアルゴリズムにダイクストラ法がある。このアルゴリズムは,車載ナビゲーションシステムなどに採用されている。
〔経路算定のモデル化〕
グラフは,有限個のノードの集合と,その中の二つのノードを結ぶエッジの集合とからなる数理モデルである。ダイクストラ法による最短経路の探索問題を考えるに当たり,本問では,エッジをどちらの方向にも行き来することができ,任意の二つのノード間に経路が存在するグラフを扱う。ここで,グラフを次のように定義する。
- ノードの個数をNとし,Nは2以上とする。ノードの番号(以下,ノード番号という)は,始点のノード番号を1とし,1から始まる連続した整数とする。ノードには,ノード番号に対応させて,V1,V2,V3,…,VNとラベルを付ける。
- 二つのノードが他のノードを経由せずにエッジでつながっているとき,それらのノードは隣接するという。隣接するノード間のエッジには,ノード間の距離として正の数値を付ける。
- 始点のノード(以下,始点という)とは別のノードを終点のノード(以下,終点という)として定める。始点からあるノードまでの経路の中から,経路に含まれるエッジに付けられた距離の和が最小の距離を最短距離という。始点から終点までの最短距離となる経路を最短経路という。
図1にノードが五つのグラフの例を示す。図1の例では,始点をV1のノードとし,終点をV5のノードとした場合の最短経路は,V1,V2,V3,V5のノードを順にたどる経路である。

図の説明テキスト
V1からV5までの5つのノードがエッジで結ばれた無向グラフ。各エッジには距離として数値が付与されている。
接続関係と距離は以下の通り。
・V1 - V2: 10
・V1 - V3: 16
・V2 - V3: 4
・V2 - V4: 3
・V3 - V4: 2
・V3 - V5: 3
・V4 - V5: 6
〔始点から終点までの最短距離を求める手順〕
ダイクストラ法による始点から終点までの最短距離の算出は次のように行う。
最初に,各ノードについて,始点からそのノードまでの距離(以下,始点ノード距離という)を作業用に導入して十分に大きい定数としておく。ただし,始点の始点ノード距離は 0 とする。この時点では,どのノードの最短距離も確定していない。
次に,終点の最短距離が確定するまで,①〜③を繰り返す。ここで,始点との距離を算出する基準となるノードを更新起点ノードという。
- 最短距離が確定していないノードの中で,始点ノード距離が最小のノードを更新起点ノードとして選び,そのときの始点ノード距離の値で,当該更新起点ノードの最短距離を確定する。更新起点ノードを選ぶ際に,始点ノード距離が最小となるノードが複数ある場合は,その中の任意のノードを更新起点ノードとして選ぶ。
- 更新起点ノードが終点であれば,終了する。
- 1で選択した更新起点ノードに隣接しており,かつ,最短距離が確定していない全てのノードについて,更新起点ノードを経由した場合の始点ノード距離を計算する。ここで計算した始点ノード距離が,そのノードの現在までの始点ノード距離よりも小さい場合には,そのノードの現在までの始点ノード距離を更新する。
〔図1の例における最短距離を求める手順と始点ノード距離〕
図1の例において,始点V1から終点V5までの経路に対して,上の①〜③を繰り返し適用する。そのとき,更新起点ノードを選ぶたびに,更新起点ノードの始点ノード距離,更新起点ノードと隣接するノードの始点ノード距離,及び最短距離が確定していないノードの始点ノード距離を計算した内容を表1に示す。

図の説明テキスト
表1 図1の例における最短距離を求める手順と始点ノード距離
| 探索適用回数 | 更新起点ノード | 最短距離が確定していない,更新起点ノードに隣接するノード | 最短距離が確定していないノード |
|---|---|---|---|
| 1回目 | V1 <0> | V2 <10>, V3 <16> | V2 <10>, V3 <16>, V4 |
| 2回目 | V2 <10> | V3 <14>, V4 <13> | V3 <14>, V4 <13>, V5 |
| 3回目 | V4 <13> | V3 <14>, V5 <19> | V3 <14>, V5 <19> |
| 4回目 | V3 <14> | V5 < ア > | V5 < ア > |
| 5回目 | V5 < ア > | — | — |
注記1 INF は,定数で十分大きい数を表す。
注記2 <>内の数値は,当該ノードの始点ノード距離を表す。
〔最短距離の算出プログラム〕
始点から終点までの最短距離を求める関数 distance のプログラムを図2に示す。配列の要素番号は1から始まるものとする。また,行頭の数字は行の番号を表す。

図の説明テキスト
図2 関数 distance のプログラム。最短距離を求めるための擬似言語プログラムリスト(1行目から29行目)。変数や配列の宣言、初期化、whileループを用いた最短距離の更新処理が記述されている。15行目のif文の条件式の一部に空欄「イ」、16行目の代入文に空欄「ウ」、25行目のif文の条件式の一部および26行目の代入文にそれぞれ空欄「エ」が含まれている。
〔最短経路の出力〕
関数 distance を変更して,求めた最短距離となる最短経路を出力できるようにする。具体的には,まず,ノード番号1〜Nを格納する配列viaNodeを使用するために,図3の変数宣言を図2の行10の直後に,図4のプログラムを図2の行21の直後に,それぞれ挿入する。さらに,各ノードの始点ノード距離を更新するたびに,直前に経由したノード番号を viaNode に格納する①代入文を一つ,図2のプログラムの行オの直後に挿入する。
このプログラムの変更によって,終点のノード番号を起点としてカたどることで,最短経路のノード番号を逆順に出力する。

図の説明テキスト
| 型・変数名 | コメント |
|---|---|
| 整数型の配列: viaNode | /* 最短経路のノード番号を格納する。初期値は 0。 */ |
| 整数型: j | /* 要素番号 */ |

図の説明テキスト
j ← GOAL /* 終点のノード番号 */
GOAL を出力 /* 終点のノード番号の出力 */
while (j が 1 より大きい) /* 最短経路の出力 */
viaNode[j]を出力
j ← viaNode[j]
endwhile
〔計算量の考察〕
関数 distance では,次のキを選ぶために始点ノード距離を計算する回数は最大でも N 回である。また,キを選ぶ回数は,一度選ばれると当該ノードの最短距離は確定するので,最大でも N 回である。よって,最悪の場合の計算量は, O( ク ) である。
設問と解答・解説
設問1
表1中の ア に入れる適切な字句を答えよ。
模範解答
17
採点基準(配点 3点)
知識・理解度(内容)(3点)
- 3点: グラフにおける最短経路探索の基礎知識を持ち、ダイクストラ法による探索手順を正しく理解して正しい距離を導出できている。
- 1点: ダイクストラ法の探索手順を部分的に理解しているが、導出過程に誤りがある。
- 0点: 解答がない、またはダイクストラ法の基礎知識が不足しており、正しい距離を導出できていない。
解説
ダイクストラ法の手順に従い、始点から各ノードへの最短距離を求める問題です。表1の文脈から、始点から対象ノードへの最短経路長を計算し、その結果を導出します。探索過程で得られる距離の最小値を正しく追跡することが求められます。
高得点のポイント
- ダイクストラ法による探索手順を正確にトレースできている。
- 各ステップでの最短距離の更新を正しく計算できている。
設問2
(1)
図2中の イ に入れる適切な字句を答えよ。
模範解答
dist[k]がminDistより小さい
採点基準(配点 2点)
知識・理解度(内容)(2点)
- 2点: 最小値を求めるアルゴリズムの基本構造を正しく理解し、適切な比較条件を記述できている。
- 1点: 比較の意図は理解しているが、大小の判定が逆になっているなど、条件式の記述に誤りがある。
- 0点: 最小値更新の条件式を正しく記述できていない。
解説
未確定のノードの中から、最短距離が最小のものを探すための条件判定の記述です。現在の最小値 minDist と対象ノードの距離 dist[k] を比較し、dist[k] が小さい場合にのみ最小値を更新します。
高得点のポイント
- 最小値を求めるアルゴリズムの基本形を正しく理解している。
dist[k]とminDistの大小関係を正しく判定する式を記述している。
(2)
図2中の ウ に入れる適切な字句を答えよ。
模範解答
dist[k]
採点基準(配点 2点)
知識・理解度(内容)(2点)
- 2点: 最小値の更新処理を理解し、適切な変数を代入できている。
- 0点: 最小値更新のプログラム構造を正しく理解していない。
解説
条件判定で新しい最小値が見つかった際に、変数 minDist を更新する代入文です。判定式で用いた dist[k] を新たな最小値として保持する必要があります。
高得点のポイント
- 最小値更新のプログラム構造を正しく理解している。
- 更新対象となる変数を正確に指定できている。
(3)
図2中の エ に入れる適切な字句を答えよ。
模範解答
dist[curNode]+edge[curNode, k]
採点基準(配点 2点)
知識・理解度(内容)(2点)
- 2点: アルゴリズムの動作を理解し、更新起点ノードを経由する場合の距離計算式を正しく記述できている。
- 1点: 更新起点ノードの距離のみを記述しているなど、エッジの重みの加算が漏れている。
- 0点: 距離更新のための計算式を正しく記述できていない。
解説
更新起点ノード curNode を経由して、隣接ノード k に至る新たな距離を計算する式です。始点から curNode までの距離 dist[curNode] に対して、curNode から k までのエッジの重み edge[curNode, k] を足し合わせる必要があります。
高得点のポイント
- 始点から更新起点ノードまでの距離と、対象ノードへのエッジの重みを加算している。
- アルゴリズムを理解し、その操作を机上で正しく再現できている。
設問2のイは,正答率が平均的であった。大小の判定が正解と逆になっている解答が散見された。最小値を求めるアルゴリズムはよく用いられており,プログラムを記述できる能力を身につけてほしい。設問2のエは,正答率がやや低かった。“更新起点ノード”から当該ノードまでの距離を加えておらず,更新起点ノードの始点ノード距離だけの式を記述した解答が散見された。アルゴリズムを理解しその操作を机上で再現する能力を身につけるとともに,注意深く解答してほしい。
設問3
〔最短経路の出力〕について答えよ。
(1)
模範解答
viaNode[k] ← curNode
25
採点基準(配点 3点)
知識・理解度(内容)(2点)
- 2点: 最短経路の経由地を記録するための代入文を正しく記述できている。
- 1点: 代入文の意図は合っているが、変数名や記述方法に軽微な誤りがある。
- 0点: 経由地を記録する処理を正しく記述できていない。
論理性(構造)(1点)
- 1点: 代入文を挿入すべき適切な行番号を論理的に特定できている。
- 0点: 挿入すべき行番号が適切でない。
解説
最短経路を復元するために、各ノードに至る直前のノード(経由地)を配列 viaNode に記録する処理です。距離が更新されたタイミングで、viaNode[k] に curNode を代入する必要があります。また、この処理は最短距離の更新処理が行われる直前などに挿入することが論理的です。
高得点のポイント
- 最短経路の経由地を記録する配列の役割を正しく理解している。
- 距離が更新される条件分岐の中に、適切な代入文を配置できている。
(2)
本文中の カ に入れる適切な字句を解答群の中から選び,記号で答えよ。
模範解答
選択肢ア: viaNode に格納してあるノード番号を
配点 2点
解説
最短経路の出力において、終点から始点に向かって配列 viaNode を逆順に辿る処理に関する問題です。配列 viaNode には、各ノードへ至る直前のノード番号が格納されているため、これを次々と参照することで経路を復元できます。
各選択肢の解説
- ア (viaNode に格納してあるノード番号を): 正答です。格納された値を参照することで前のノードを辿ることができます。
- イ (viaNode の要素番号を大きい方から): 誤りです。要素番号の大小は経路の探索順序と無関係です。
- ウ (viaNode の要素番号を小さい方から): 誤りです。イと同様に要素番号の順序は経路順序を表しません。
設問3(1)のオは,正答率が低かった。本文を読み取り,プログラムの処理の流れを正確に理解して解答してほしい。
設問4
〔計算量の考察〕について答えよ。
(1)
本文中の キ に入れる適切な字句を,本文中の字句を用いて 10 字以内で答えよ。
模範解答
更新起点ノード
採点基準(配点 3点)
正確性(内容)(3点)
- 3点: 本文中の字句を用いて、「更新起点ノード」を正確に抜き出している。
- 1点: 意味は通じるが、本文中の指定された字句と完全に一致していない。
- 0点: 適切な字句を抜き出せていない。
解説
ダイクストラ法において、未確定ノードの中から最短距離が最小のものを選択する操作に関する考察です。本文中では、この選択され確定したノードを更新起点ノードと呼称しています。
高得点のポイント
- 計算量考察の文脈を理解している。
- 本文中の用語を文字数制限の範囲内で正確に抜き出している。
(2)
本文中の ク に入れる適切な字句を答えよ。
模範解答
N2
採点基準(配点 3点)
知識・理解度(内容)(3点)
- 3点: アルゴリズムの構造から計算量を適切に見積もり、正しいオーダを導出できている。
- 1点: 計算量の見積もりの考え方は一部正しいが、最終的な導出結果に誤りがある。
- 0点: 計算量に関する基礎知識が不足しており、正しい導出ができていない。
解説
グラフのノード数を としたときの、ダイクストラ法の計算量を見積もる問題です。未確定ノードからの最小値探索に の時間がかかり、これを全ノードに対して繰り返すため、二重ループの構造となり全体で の計算量となります。解答としては が求められます。
高得点のポイント
- 繰り返し処理の構造による計算量の見積もりを正確に行えている。
- グラフのノード数 に対する計算量のオーダを理解している。