「ダイクストラ法」の編集履歴(バックアップ)一覧はこちら

ダイクストラ法」(2007/07/03 (火) 19:26:31) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

1. 配列cost を用意する。cost の大きさは町の数と同じである。配列cost に最大値(INT_MAX)を入れておく。ただし、スタートの町だけは、cost の値を0 にしておく。 2. 配列usedFlag のすべての要素を0 で初期化しておく。これはまだ使用していないことを意味する。 3. すべての町i の中で、usedFlag[i]が0 で、かつ最小のcost[i]を持つ町x を探す。 4. 町x が見つからないか、町x のcost[i]が大きな値(INT_MAX)ならば、終了。 5. 町x を使用済みとする。(usedFlag[x] ← 1) 6. 町x を経由していける場所のコストを更新する。すなわち、町i に対して、cost[i] > cost[x]+町x から町i へのコストならば、cost[i] = cost[x]+町x から町i へのコストとする。町i には町x からきたことを記録する。 7. 3に戻る。 void dijkstra( istream &is ) { int start, end; int usedFlag[matMax]; int cost[matMax]; int beforeCity[matMax]; while( true ) { if ( !(is >> start >> end ) ) break; // 初期化 for( i=0; i<matMax; i++ ) usedFlag[i] = 0; for(i=0; i<matNum; i++ ) cost[i] = INT_MAX; //最後の町は訪れたことにする cost[end] = 0; while( true ) { // 使用済みでない最小の町を求める int minVal = INT_MAX; int min; for( i=0; i<matNum; i++ ) { if ( usedFlag[i] == 0 && minVal > cost[i] ) { min = i; minVal = cost[i]; } } //終了チェック if ( minVal == INT_MAX ) break; // 使用済にする usedFlag[min] = 1; // 町min から行ける町のcost を更新 for( i=0; i<matNum; i++ ) { if ( mat[min][i] && cost[min]+mat[min][i] < cost[i] ) { cost[i] = cost[min]+mat[min][i]; beforeCity[i] = min; } // 結果の出力 bool firstFlag = true; while(true) { if ( firstFlag ) firstFlag = false; else cout << " "; cout << (start+1); if ( start == end ) break; start = beforeCity[ start ]; cout << endl; } } }
1. 配列cost を用意する。cost の大きさは町の数と同じである。配列cost に最大値(INT_MAX)を入れておく。ただし、スタートの町だけは、cost の値を0 にしておく。 2. 配列usedFlag のすべての要素を0 で初期化しておく。これはまだ使用していないことを意味する。 3. すべての町i の中で、usedFlag[i]が0 で、かつ最小のcost[i]を持つ町x を探す。 4. 町x が見つからないか、町x のcost[i]が大きな値(INT_MAX)ならば、終了。 5. 町x を使用済みとする。(usedFlag[x] ← 1) 6. 町x を経由していける場所のコストを更新する。すなわち、町i に対して、cost[i] > cost[x]+町x から町i へのコストならば、cost[i] = cost[x]+町x から町i へのコストとする。町i には町x からきたことを記録する。 7. 3に戻る。 void dijkstra( istream &is ) { int start, end; int usedFlag[matMax]; int cost[matMax]; int beforeCity[matMax]; while( true ) { if ( !(is >> start >> end ) ) break; // 初期化 for( i=0; i<matMax; i++ ) usedFlag[i] = 0; for(i=0; i<matNum; i++ ) cost[i] = INT_MAX; //最後の町は訪れたことにする cost[end] = 0; while( true ) { // 使用済みでない最小の町を求める int minVal = INT_MAX; int min; for( i=0; i<matNum; i++ ) { if ( usedFlag[i] == 0 && minVal > cost[i] ) { min = i; minVal = cost[i]; } } //終了チェック if ( minVal == INT_MAX ) break; // 使用済にする usedFlag[min] = 1; // 町min から行ける町のcost を更新 for( i=0; i<matNum; i++ ) { if ( mat[min][i] && cost[min]+mat[min][i] < cost[i] ) { cost[i] = cost[min]+mat[min][i]; beforeCity[i] = min; } } // 結果の出力 bool firstFlag = true; while(true) { if ( firstFlag ) firstFlag = false; else cout << " "; cout << (start+1); if ( start == end ) break; start = beforeCity[ start ]; cout << endl; } } }

表示オプション

横に並べて表示:
変化行の前後のみ表示: