pafuイーランスクール 学んでできる

メニューへ戻る

アルゴリズム基礎解説(平成15年秋期問4)

問題の確認

解説
プログラムの動作をトレースしながら解説します。
まず、初期設定において各配列を初期化していきます。このときC[i,j]に関してはまず最初の情報として、地点1から各地点への距離の値を代入します。それが終わったら地点1の処理を終了したという証明としてP[1]に1を代入します。Pはフラグのような役割と思われます。
その後、最初の空欄のある{最短経路を求める手順}の部分に移ります。まず、繰り返し用の変数であるXに2を代入します。以降はXがNのときまで(図1の場合は5)繰り返されます。次に地点を表す変数Yに2を代入し、最短距離を表す変数Zに初期値∞を代入します。ここからが空欄aの部分になります。ループはY=5のときまで繰り返されます。
では、値を代入しながら見ていきます。
Y=2
1. P[2]=0であり、かつD[2](=30)<Z(=∞)であるので処理を続行。
2. 最短地点を格納する変数Tに2を代入。
3. 空欄a
4. Y←3
この3.の部分で何をするのかというと、次の動作に移っていく上で最短距離を表す変数Zの値を更新していかなければならないのです。よってここではZにD[2]の値を格納し、Y=3に移行します。従ってaに入るのはキのZ←D[Y]となります。
トレースを続けると、
Y=3
1. P[3]=0だが、D[3](=∞)>Z(=30)なので処理をしない。
2. Y←4
Y=4
1. P[4]=0で、かつD[4](=20)<Z(=30)なので処理を続行。
2. Tに4を代入し、さらにZに20を代入
3. Y←5
Y=5
1. P[5]=0だがD[5](=120)>Z(=20)なので処理をしない。この時点でT=4が確定
2. Y←6。このあとループを抜ける
そしてP[4]←1となります。これで以上の部分ではもう地点4に関する処理は行われません。次に地点4から最も短い経路の探索を行います。
Y=2
1. P[2]=0だがD[2](=30)<D[4]+C[4,2](=20+∞)なので何もしない。
2. Y←3
Y=3
1. P[3]=0でありD[3](=∞)<D[4]+C[4,3](=20+50)なので続行。
2. D[3]に70を代入し、bを実行
3. Y←4
2つ目の空欄が出てきます。問題文を見ると、Dを置換した時は直前地点を格納する配列SにTを代入するとあります。ここではS[3]に4(=T)を代入します。よってbはエのS[Y]←Tとなります。この処理をY=5のときまで行います。ちなみにこの後はDは置換されないので、S[3]=4が確定します。ここを抜けるとX←3となり、また最初から以上を行います。
次に出力処理を見ていきます。まず繰り返し変数Xに1、Yにこの場合は5を代入します。その下のループでは、
1. YをW[X]という配列に(印字のために使う)代入。ここではW[1]←5。
2. cを実行してX←2
このcですが、この部分の変数はXとYの2種類しかないので、事実上オとカの2択になります。
オのY←S[X]だとこの後YにS[1]が入ることになるのですが、地点1の前には何もありません。このあと誤動作が起きてしまいます。
カのY←S[Y]では、YにS[5](=3)が入ります。この後Xが2になって、次のループのときはW[2]に3が入ります。そしてYにはS[3](=4)が代入され、次のX=3のとき、W[3]に4が代入されます。最後にS[4](=1)がYに代入されます。
Y=1なのでループから抜け、その後W[4]に1が代入されます。
最後にWの内容をXの降順に表示していき、Xが1の時まで繰り返します。これで図にある様に1→4→3→5と表示できます。
以上のことからcはカのY←S[Y]、dはアのX>0になります。

匿名様 ご投稿

メニューへ戻る

pafuイーランスクール

pafuイーランスクール 学んでできる