トピックポータル
問題解決のアイデア:
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 }