羅区P3371 [テンプレート]単一始点最短経路(弱いバージョン)(ダイクストラ隣接リスト)

トピックポータル

問題解決のアイデア:

ポータル

ACコード:

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <CStringの>
 4  
5  使用 名前空間STD。
6  
7  構造体KKK {
 8      INT  から、へ、V、次;
9 } E [ 500001 ]。
10  int型 N、M、S、頭[ 500001 ]、Q、W、P、TOT、ANS [ 500001 ]。
11  BOOL VIS [ 500001 ]。
12  
13  ボイド(追加INT Q、INT、W のint {P)
 14を     E [++ TOT]。= Q。
15      E [TOT] .TO = W。
16      E [TOT] .V = P。
17      E [TOT] .next = 頭部[Q]。
18      頭[Q]は= TOTを、
19 }
 20 21 空隙ダイクストラ(int型の){
 22      のmemset(VIS、0はsizeof (VIS))。
23の      ANS [S] = 0 ;
24 のためにint型 i = 1 ; iが<= N; iが++ ){
 25 のint ID = 0  
               、和= 0x3f3f 26          のためのint型 J = 1 ; J <= N; J ++ 27              であれば(!VIS [J] &&和> =のANS [J])
 28                  合計=のANS [J]、ID = J。
29          VIS [ID] = 1 30          のためにINT J =頭部[ID]; J; J = E [J] .next)
 31の              ANS [E [J] .TO] =分(ANS [E [J] .TO]、ANS [ID] + E [J] .V)。
32      }
 33  }
 34  
35  INT メイン(){
 36      のscanf(" %D%D%D"、&​​N、&M&S)、
 37      のためにint型 i = 1 ; iが<= N; iが++ 38の          ANS [I] = 0x3f3f3f3f ;
 39      用のint型 I = 1 ; I <= M; iが++ ){
 40          scanf関数(" %D%D%D "、&​​Q、&W&P);
 41          追加(Q、W、P);
 42          
43      }
 44      ダイクストラ(S)、
 45      のためにint型 I = 1 ; I <= N ; I ++ ){
 46          もし(ANS [I] == 0x3f3f3f3f)のprintf(" 2147483647 " )。
47          他の
48              のprintf(" %dの" 、ANS [I])。
49      }
 50      リターン 0 51 }

 

おすすめ

転載: www.cnblogs.com/lipeiyi520/p/11257156.html