POJ 1511--招待カード(ダイクストラ+プライオリティキュー)

ただ,,,実際には、策定してきた、複雑だと思うようになった二回+プライオリティキューをダイクストラ(実際には、ボードの問題は、限り良いボードがあるので、残りはものではありません)、それはシンプル行うには良い感じ... ...

質問の意味: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 }

 

おすすめ

転載: www.cnblogs.com/lilibuxiangtle/p/11332954.html