牛は帰宅ティル
ベッシーは、フィールドに出ているとファーマージョンは朝の搾乳のために彼女を覚醒する前にできるだけ多くの睡眠として取得するために納屋に戻って取得したいです。彼女は可能な限り迅速に戻って取得したいので、ベッシーは、彼女の美しさの睡眠を必要とします。
ファーマージョンのフィールドがN(2 <= N <= 1000)、その中のランドマーク、一意の番号1..Nを有しています。ランドマーク1は納屋です。ベッシーは終日立ったリンゴの木グローブランドマークN.牛は、ランドマークの間の種々の長さのT(1 <= T <= 2000)双方向牛トレイルを使用してフィールドに移動されます。彼女はそれを開始した後、彼女はいつも最後までその開始から歩道にとどまるようベッシーは、彼女のナビゲーション能力の自信がないです。
ランドマーク間の道を考えると、ベッシーは納屋に戻って取得するために歩いてしなければならない最小の距離を決定します。このようないくつかのルートが存在することが保証されています。
入力
*線2..T + 1:各行は3スペースで区切られた整数として歩道を説明しています。最初の二つの整数は、TRAILが移動する間のランドマークです。第三の整数は、範囲1..100軌跡の長さです。
出力
1 CONST INT MAXM = 1010 。 2 構造体の縁{ 3 int型、U。 4 INT C。 5 int型DIST。 6 }。 7エッジE [MAXM]。
ソースノードからすべてのノードまで1.初期化プロセスの初期距離
1 CONST INT INF = 1E9。 2 ための(INT iは= 0 ; iが<= N; I ++ ) 3 DIST [I] = INF。 4 DIST [Sノード] = 0 ;
ベルマン・フォード・プロセス
1 のための(INT iが= 0 ; iが<N- 1 ; I ++ ){ 2 BOOL ISOK = 偽。 3 用の(int型 J = 0 ; J <M J ++ ){ 4 INT U = E [J] .U。 5 int型、V = E [J] .V。 6 int型 D = E [J] .dist。 7 場合(DIST [U] + D < DIST [V]){ 8 DIST [V] = DIST [U] + D。 9 ISOKは= 真。 10 } 11 そう であれば(DIST [V] + D < DIST [U]){ 12 DIST [U] = DIST [V] + D。 13 ISOKは= 真。 14 } 15 } 16 もし(!ISOK)ブレーク。 17 }
ノードNの時間複雑さの数、エッジ数MO(N * M)
•ノードにすべてのノードを最短距離の例を求めて1
1.初期
のすべてのノードのDISTに送信元ノードから•距離
2サイクル
()ステップ1•すべてのエッジを横切る、端縁の両端部は、ソース点から距離を更新します
--1--22は5になります
--1--33へ1
--1--44は5になります
--2--3更新することはできません
--2--5更新することはできません
--4--5ない更新
ソースノード•すべてのノードからディスト距離
(b)工程2
•ソースからのすべての側面、距離の更新側端点の両端を横切ります
--1--2更新されません
--1--3更新されません
--1--4更新されません
--2--32は2となります
--2--55は10となり
--4--55は11となり
ソースノード•すべてのノードからディスト距離
(c)工程3
•ソースからのすべての側面、距離の更新側端点の両端を横切ります
--1--2更新されません
--1--3更新されません
--1--4更新されません
--2--3更新されません
--2--55になり7
--4--5更新されません
ソースノード•すべてのノードからディスト距離
(d)工程4
•ソースからのすべての側面、距離の更新側端点の両端を横切ります
--1--2更新されません
--1--3更新されません
--1--4更新されません
--2--3更新されません
--2--5更新されません
--4--5更新されません
ソースノード•すべてのノードからディスト距離
(E)終了条件のすべてが更新されません
おそらくそれは、このプロセスは、以下のように問題のコードは解決し、次のとおりです。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include <CStringの> 4の#include <アルゴリズム> 5 のconst int型 N = 2020 。 6 CONST INT = MAX 1E9。 7 使用して 名前空間はstdを、 8 構造体ノード{ 9 int型A、B、W。 10 }エッジ[N]。 11 整数N、M。 12 ボイドベル() 13 { 14 INT I、J。 15 INT D [N]。 16 用(INT I = 1 ; Iは<= N-; I ++)// *は無限の距離を初期化; 17 { 18である D [I] = MAX; 19 } 20である D [ 1 ] = 0 ; // * 0は初期位置です。 21である ため(私は= 1 ; I <= N; I ++ ) 22は 、{ 23である ため(J = 1。 ; J <= M; J ++ ) 24 { 25 IF(D [エッジ[J] II.A]> D [エッジ[J ] .B]エッジ+ [J] .W)D [エッジ[J] II.A] = D [エッジ[J] .B] + エッジ[J] .W、 26は IF(D [エッジ[J] .B]> D [エッジ[J] .A] +エッジ[J] .W)D [エッジ[J] .B] = D [エッジ[J] .A] + エッジ[ J] .W。 27 } 28 } 29 のprintf(" %D \ n " 、D [N])。 30 } 31 のint main()の 32 { 33 INT I、A、B、C。 34 CIN >> M >> N。 35 のために(INT iは= 1 ; I <= M I ++)// *结构体存边和权 36 { 37 CIN >> B >> C。 38 エッジ[I] .A = 。 39 エッジ[i]は.B = B。 40 エッジ[I] .W = C。 41 } 42 ベル()。 43 リターン 0 。 44 }
今、私たちは、一生懸命、問題のこれらの種類、そこSPFAか何かを把握する訓練を受けて、ゆっくり来ることができます!半分以上の訓練、是非!