Dijsktraを解決するための最短経路アルゴリズム
説明
マップは、都市(有向グラフ)、各経路の長さが知られているとの間のm個の経路を仮定すると、n個の都市を含みます。街のポイントとエンドポイントを開始する都市のマップを考えると、最後の開始との間の最短経路を見つけるためにDijsktraアルゴリズムを使用します。
エントリー
データの複数のセットは、各データ線は、M + 3を有しています。最初の二つは、整数n及びmの行為、n個の都市の数とパス数mを表します。2行目は、各都市の名前に代わって、n個の文字を持っています。M + 2行の各第3行は2つの文字bおよび整数dを有する、都市Bから都市の代表経路の距離dを有します。最後の2つの文字は、最短経路を求めていることが市の始点と終点に代わって動作します。場合nおよびmは、両方の入力端ゼロに等しいです。
輸出
各二つのデータ出力ライン。最短長さの開始から終了までの間に最初の行の整数。パスを表す行為列の第二シリーズ。各文字の間のスペースで区切られています。
サンプル入力1
3 3 ABC AB 1 BC 1 AC 3 AC 6 8 ABCDEF AF 100 AE 30 AC 10 BC 5 CD 50 ED 20 EF 60 DF 10 AF 0
サンプル出力1
2 ABC 60 AEDF
#include <iostreamの> する#include < ストリング > の#include <CStringの> に#define MAXINT 32767 の#define MVNum 100 // 頂点の最大数は、 / * 隣接行列と有向グラフがあることに注意してください * / int型の D [MVNum]; // 開始点それぞれの開始点までの距離 INT S [MVNum]; // 訪問 intをパス[MVNum]; 使用 名前空間STD; typedefの構造体 { チャーvexs [MVNum]; int型ARCS [MVNum] [MVNum]; int型vexnum、arcnum。 AMGraph}; INT見つけ(AMGraph&G、チャー S)//が返回编号 { ため(INT iは= 1 ; I <= G.vexnum; iは++ ) { 場合(G.vexs [I] == S) を返すのI。 } } ボイドクリート(AMGraph&G) { ため(INT iは= 1 ; I <= G.vexnum; I ++ ) { CIN >> G.vexs [I]。 } のための(INTは iは= 0 ; I <= G.arcnum; I ++ ) のための(INTJ = 0 ; J <= G.arcnum。J ++ ) { G.arcs [I] [J] = MAXINT。 } のための(INT iは= 0 ; I <G.arcnum I ++ ) { char型A、B。 int型のC; CIN >> B >> C。 INT H、T。 H = 見つけ(G、)。 T = (G、B)を見つけ。 G.arcs [H] [T] = C。// 有向图 } } 無効ダイクストラ(AMGraph&G、int型V0) { int型のn = G.vexnum。 int型V; 用(V = 1 ; V <= N; V ++ ) { S [v] = 0 。 D [v] = G.arcs [V0] [V]。 もし(D〔V〕< MAXINT) パス[V] = V0。 他の パス[V] = - 1 ; } S [V0] = 1 。 D [V0] = 0 ; 以下のための(int型 I = 0; I <N - 1。I ++ ) { int型分= MAXINT。 int型、V = 1 ; 用(INT = W 1であり; n = <W、W ++ ) { 場合(S [W] =!1 && D [W] <= 分) { V = W。 分 = D [W]。 } } S [V] = 1 。 用(INT = W 1、W <= N; W ++) { 場合(S [W]!= 1 &&(D [V] + G.arcs [V] [W] < D)[W]) { D [W] = D [V] + G.arcs [V] [W]。 パス[W] = V。 } } } } ボイドプリント(AMGraph&G、INT S、int型E) { int型の R [MVNum]。// 记录路径的编号 R [ 0 ] = E。 int型私は= 1 ; 一方、(パス[R [I- 1 ]] =! - 1 ) { R [I] =パス[R [I - 1 ]。 I ++ ; } のための(INT J = - 1、J> 0 ; j-- ) COUT << G.vexs [R [j]] << " " 。 COUT << G.vexs [R [ 0 ] << ENDL。 } int型のmain() { int型N、M。 一方、(CIN >> N >> M) { 場合(N == 0 && M == 0 ) ブレーク。 AMGraph G。 G.vexnum = N。 G.arcnum = M。 クリート(G)。 char型の開始、終了。 CIN >>開始終了を。 int型S、E。 S = (G、開始)を見つけ。 E = (G、端)を見つけ。 ダイクストラ(G、S)。 COUT << D [E] << ENDL。 印刷(G、S、E)。 } 戻り 0 。 }