フロイドのアルゴリズム
コアコード:
1 用(K = 0 ; K <N- ;; K ++ ) 2 のための(I = 0、I <N - 、I ++ ) 3。 ため(J = 0 ; J <N-; J ++ ) 。4 IF([I] [K] + A [K] [J] < [I] [J]) 5。 { 6。 A [I] [J]が[I] [K] + = [K] [j]を、 7 パス[I] [ J] =パス[K] [J]; //は、経路長を短く、k個のJをバイパスする 。8 } 9。 // [I] [J]は、頂点iとjの間の最短経路長であり、経路[I] [J] jは、対応する前頂点路で 10 // 頂点の頂点番号
中間点kを追加するための3重ループを分析し、最短経路を見つけるために、スキャン。Oの時間複雑さ(N ^ 3)、中間頂点大幅な増加、パスは元の長さ未満であるかどうかを決定しようとすると、元の経路、変形行列要素を交換するために未満、より新しい経路です。
シンプルなケース:
毎年恒例の学校の競争では、すべての学生のファイナリストは非常にいいTシャツを受け取ることになります。衣料品の作品の何百ものスタッフが店からスタジアムに戻って出荷された時はいつでもしかし、彼らは非常に疲れているとき!だから今、彼らはあなたがそれらを助けることができ、店舗からスタジアムへの最短ルートを見つけたいですか?
入力データの複数のセットを含みます。各二つの整数N、M(N <= 100、M <= 10000)の最初の行、Nは成都、符号1は、交差点の位置、N指定交差点を格納するいくつかの通りの交差点を表します競技場の場所があり、Mは、成都の選択肢のカップルを示しています。Nは= M = 0は、入力の終了を示します。次のM行、三つの整数A、B、C(1 <= A、B <= N、1 <= C <= 1000)を含む各行は、我々は、交点Aと交点Bとの間の経路があることを示しC-分の時間にスタッフの必要性は、この道を旅しました。店舗への少なくとも1つのトラックの存在を確実にするために、入力ライン。各入出力ラインに対して、トラック労働者がストア最小時間から来る表します
サンプル入力
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
サンプル出力
3 2
#include <入出力ストリーム> の#define 0x3f3f3f3f MAXN 使用して 名前空間STD; INT低コスト[ 1000年 ] [ 1000 ]、I、J、K、N-; // グローバル変数は、すべての変数を初期化 ボイドフロイド() { ため =(Kを1。 K ++; K <= N ) のための(I = 1 ; I <= N; I ++ ) のための(J = 1。 ; J <= N; J ++ ) IF(低コスト[I] [K] +低コスト[K] [J < 低コスト[I] [J]) 低コスト[I] [J] =低コスト[I] [K] + 低コスト[K] [J]; } INT のmain() { int型のM、C、B、 一方(CIN >> N-M)// Bとの間の分の数の代表からのブロックの数、M大規模なもののために、C N-表す { IFを(N - == M && N - == 0 ) BREAK ; のための(I = 1 ; I <= N; I ++ ) のための(J = 1。 ; J <= N; J ++ ) { IF(I == J)低コスト[I] [ J] = 0 ; // すなわち0に設定スラッシュ0重量の値 他の 低コスト[I] [J] = MAXN; // 重み値が無限アレイに設定されている } のための(I = 1; I <= M; I ++ ) { CIN >> A >> BとC; // 入力経路(すなわち、配列の添字)A、B、Cは体重れる 低コスト[A] [B] =低コスト[B] [ A] = C; // パスを格納するが、B先取特権アレイ値C標識 } )フロイド(; //は、最短パスアルゴリズムフロイド呼び出し COUT <<低コスト[ 1 ] [N-] << ENDL ; } 戻り 0 ; }