ただ,,,実際には、策定してきた、複雑だと思うようになった二回+プライオリティキューをダイクストラ(実際には、ボードの問題は、限り良いボードがあるので、残りはものではありません)、それはシンプル行うには良い感じ... ...
質問の意味:N、N-局とボランティア持って朝のサイトに各ボランティア、夕方に戻って、最小のコストでどのくらい尋ねます。それは有向グラフであります
夜のダイクストラ得オーバーヘッドで、再び最初の朝は再び逆さま駅でオーバーヘッドを得たダイクストラと1-4は4-1になったと。
長い長いを開くために覚えて、INFで、この質問がmemsetの場合WAになります初期化するためにmemsetを使用しないでください。
1の#include <cstdioを> 2の#include <CStringの> 3の#include <キュー> 4 使って 名前空間STDを、 5 6 のconst int型 INF = 1E9 + 10 。 7 のconst int型 N = 1000010 。 8 のconst int型 M = 1000010 。 9 int型のTOT; 10 11 構造体のエッジ // ダイクストラ+优先队列板子 12 { 13 int型V、コスト、次。 14 }エッジ[M]。 15 16 構造体qnode 17 { 18 int型V、C。 19 ブール 演算子 <(CONST qnode&X)のconst { 20 リターン C> X。C; 21 } 22 }。 23 24 のint ヘッド[M]。 25 BOOL VIS [N]。 26 INT DIS [N]。 27 28 空隙 addedge(int型 Uを、int型 V、INT w)の 29 { 30 エッジ[TOT]。V = V; 31は エッジ[TOT】コスト= W; 32 。エッジ【TOT次に= ヘッド[U]; 33である [U] = TOT ++ヘッド、 34である } 35 36 空隙ダイクストラ(int型ST)を 37 [ { 38は VISのmemset(、0、はsizeof (VIS)); 39 のために(INT I = 0、I <Nで、Iは++ ) 40 DIS [I] = INF; // のmemsetを容易に、WA INFで初期化しないことをお勧め です41 DIS [ST] = 0 ; 42である PRIORITY_QUEUE <qnode>Q; 43 Q。プッシュ({ST、0 })。 44 ながら(!Q。空の()){ 45 qnodeさt = Q。上(); 46 Q。ポップ(); 47 であれば(VIS [T V]) 48 続けます。 49 VIS [トン。V] = 真; 50 のためには、(int型 I =ヘッド[T V]を、I =! - 1 ; I = エッジ[i]を、次の。){ 51 のint V = エッジ[I]。V; 52 INTのコスト= エッジ[I]。コスト; 53 もし(!VIS [V] && DIS [V]> DIS [T。V] + コスト){ 54の DIS [V] = DIS [T。V] + コスト。 55 Q。プッシュ({V、DIS [V]})。 56 57 } 58 } 59 } 60 } 61 62 INT [N]、B [N]、[N] C。 63 64 INT メイン(){ 65 のint N、M、T。 66 のscanf(" %dの"、&T)。 67 一方(t-- ){ 68 のscanf(" %D%dの"、&N、&M)。 69 TOT = 1 。 70 のmemset(エッジ、0、はsizeof エッジ)。 71 のmemset(ヘッド、 - 1、はsizeof (ヘッド))。 72 のためには、(int型 i = 0 ; iがm <; iは++ ){ 73 のscanf(" %D%D%D "、および[I]、&B [i]は、&C [I])。 74 addedge([I]、B [i]は、C [I])。 75 } 76 ダイクストラ(1)。 // 早上的 77 のint = SUM 0 ; 78 用の(int型 I = 2 ; I <= N; Iは++ ){ 79 SUM + DIS = [I]; // 追加するために、各ステーションのための最小コストの 80 } 81 TOT = 1 。 82 のmemset(エッジ、0、はsizeofのエッジ) 83 のmemset(ヘッド、 - 1、はsizeof (ヘッド)); 84 のために(INT I = 0 ; iがmを<; I ++は){ 85 addedge(B [I]、A [I]、C [I]); // nは順番に各ステーションに、ステーションのそれぞれに1である 86 } 87 ダイクストラ(1); // 夜 88 以下のために(int型 I = 2 ; I <= N; Iは++ ){ 89 SUM + DIS = [I]; // 各ステーション1の最小コストまで追加する 90 } 91である のprintf(" %d個の\ N- " 、SUM) ; 92 } 93 リターン 0 ; 94 }