// プログラム2-4 の#include <iostreamの> する#include <WINDOWS.H> の#include <スタック> 使用して 名前空間STD; のconst int型 N = 100 ; // 都市の数が変更されてもよい のconst int型 INF = 1E7; // 無限10000000 INTマップ[N] [N]、DIST [N]、P [N]、N-、M; // のN-都市数、mは都市間の経路の数がストリップである BOOLを [N]フラグに; // の場合[i]が真と等しい、頂点I記述は集合Sに追加された、そうでない場合、iは頂点の集合に属するVS 無効ダイクストラを(INT U) { ため(int型のI = 1 ; I <= N; iは++ ) { DIST [I] =マップ[U] [I]; // uは互いに頂点への最短経路長をソース初期化 フラグ= [I]でfalseに、 IF(DIST [I] == INF) Pを[I] = - 1 ; // 路長とソース頂点のu iとuのソース頂点に隣接していないことを示す、無限大である 他の P [I] = U; //は、頂点を記載U i及びソース点に隣接し、設定された頂点I前駆物質P [I] = U } DIST [U] = 0 ; フラグ[U]に = trueに ; // 最初に、集合Sにおける唯一の要素:ソースU ため(INT I = 0、I <N - 、++ I) { int型のTEMP = INF、T = U; のための(INT J = 1。 ; J <= N; J ++)// Uは、最も近い頂点tをVSに設定された距離源シーク IF(フラグに[J] && DIST [J] <!TEMP ) { T = J; TEMP = DIST [J]; } IF(T == U)リターン ; //はTを見つけることができない、ループの外 フラグに[t]は= trueに、 // そうでない場合は、Tを設定するために添加される ため(INT = J 1、Jは<= N; J ++)// ソース点Uの距離に隣接する頂点をtに更新 IF(フラグ[J] &&マップ[T] [J]で<!INF) IF(DIST [J]>(DIST [T] + マップ[T] [J])) { DIST [J] = DIST [T] + マップ[T] [J]。 P [j]は = Tと、 } } } ボイド findpath(INT U) { int型のX。 スタック < int型 > S; 裁判所未満 << " 源点为:" << U << てendl; 以下のために(int型 i = 1 ; iが++; iが<= N ) { X = P [i]は、 同時に! - (X = 1) { S.push(X); X = P [X]; } COUT << " 各頂点のような他のソースの最短パス:" ; ながら(!S.empty()) { COUT << s.top( )<< " - " ; s.pop(); } COUT << << I " ;最短距離である:" << DIST [I] << ENDL; } } int型のmain() { int型U、V、 W、ST; システム(" 色0D "); coutの << "都市の数を入力してください:" ; CIN >> <<てendl N-を、 COUTを << " 都市間のルートの番号を入力してください:" <<てendl; CIN >> メートル; COUT << " してください入力ラインと都市間距離:" << ENDL; のための(INT I = 1 ; I <= N; I ++ ) のための(INT J = 1 ; J <= N; J ++ ) { マップ[I] [J] = INF。// 隣接行列無限の初期化 } ながら(M--を) { CIN >>U >> V >>W; マップ[U] [V] =分(地図[U] [V]、W); // 隣接行列ストレージ、最小距離保持する } COUT << " ボブの場所を入力してください。" << ENDLを;; CIN >> ST、 ダイクストラ(ST); COUT << " 位置ボブ:" << ST << ENDL; のための(int型私は= 1 ; I <= N-Iは++ ) { COUT << 」ボブ:" << << ST "- " << ":新しい場所へ」<< I; IF(DIST [I] == INF) COUT << " 申し訳ありませんが、決してアップ" << ENDL; 他の COUT << " の最短距離である:" << DIST [I] << ENDL; } FindPath(ST); 戻り 0 ; }