授業で示したプログラムをベースに、下記の改良を加えたプログラムを作成せよ。
授業で示したDijkstraのアルゴリズムに、下記のようなグラフ(graph.txt)を与えた場合、正常に動作することを保証できるか?
(1B-a)無向グラフとした場合
必修課題1Aのプログラムについて、下記の改良を施せ。
[A] 隣接行列の内容をファイルから読み込むこと。この部分は関数として作成すること。
(A1)ファイル内では、まず、最初の数字が配列の縦の要素数(R)、2つ目の数字が配列の横の個数(D)を示す。
(A2)続けて、1行について、D個の整数が並ぶ。それがR行続く。
(A3)ファイル内には数字以外の文字列は含まれない。ただし、空行は存在する。
(A4) 例:グラフ140, グラフ150
(A5)ファイル名は固定でgraph.txtとしてよい。
(A6)エッジの不存在は、999の値で示す。
[B]プログラム内で隣接行列は大域変数で固定サイズ(N)で確保してよい。固定の場合、Nは20以上にすること。
[C]標準入力から、探索始点となる頂点番号を指定できること。
[D]探索終了後、全ての頂点に対して始点頂点からの経路とコストが分かるように表示すること(このとき日本語を使わないこと)。
(D1)始点と終点が一致する場合は例外として表示すること。
(D2)始点と終点との間に経路が存在しない場合はその旨表示すること。
L棟5階の計算機室で必ずコンパイルと実行ができること。
プログラムで工夫した行について、必ず何かしらの説明をコメントの形でプログラム中に書き込むこと。
コメントが不十分なプログラムは提出とはみなさないことがあるので注意すること。
発展課題1X-1を提出する場合は、1A-1と1X-1は同じソースファイルでもよい(1X-1にも対応していることをコメントで明示すること)。
【状況】
【指示】
誰かに教えてもらった場合:
その学生(氏名と9桁の学籍番号)をプログラム先頭に記し、さらにプログラム中コメントを使って、教えてもらったところの解説を独自の説明で数行以上書き込むこと。
(教えてもらった部分の解説コメントのないプログラムは全く評価しません。「全体です」のようなコメントの場合も同じです。)
誰かに教えてあげた場合:
その学生(氏名・学籍番号)をプログラム先頭に記すこと。
お互いに相談した場合:
お互いの氏名・学籍番号を、教えてもらった・教えてあげたの例に準拠して提出してください。
グラフ150をgraph.txtとして置いて、頂点0から実行した結果を保存したテキストファイル。
正常動作を保証できる場合、その理由を説明せよ(数行程度の説明でよい)。必要ならその根拠となるプログラム構造を示しながら説明せよ。
正常動作を保証できない場合、その理由を説明せよ(数行程度の説明でよい)。必要ならその根拠となるプログラム構造を示しながら説明せよ。また、可能なら正常動作が保証できない隣接行列(グラフ)の例を示せ。
(なお、授業では、有向グラフで、自頂点へのエッジはなく、重みは正整数値のみを前提としていた。)
(1B-b)隣接行列の各要素に正の実数値を許した場合
(1B-c)隣接行列の各要素に(対角要素以外でも)0を許した場合
(1B-d)隣接行列の各要素に(対角要素以外でも)負の整数値を許した場合
(1B-e)隣接行列の各要素に(対角要素以外でも)負の整数値を許すが、閉路がないことをあらかじめ保証した場合。
(a)-(e)は全て1つのpdf内に解答を示すこと。moodle上で提出してください。バックアップを各個人で別に持っておくことを薦めます。
改良箇所には対応する番号とコメントを付すこと。
(1Xa) edge二次元配列を、graph.txtの内容に合わせて動的に確保すること。
(1Xb) 起動時に第一引数があれば、それをgraph.txtの代わりのファイル名として隣接行列を読み込むこと。
(1Xc) graph.txtの隣接行列で、負の整数値があればそこをリンクなしとして取り扱うこと。
(1Xd) graph.txtの隣接行列に浮動小数点数があれば、その旨を表示して終了すること。
(1Xe) graph.txtの隣接行列で要素数不足があれば、その旨を表示して終了すること。
L棟5階の計算機室で必ずコンパイルと実行ができること。
元のプログラムから改良・挿入した行について、説明をコメントの形でプログラム中に書き込むこと。
(1Xa) - (1Xe)のそれぞれの挙動が分かるようなプログラム実行結果を保存したテキストファイル。