。
1つの#include <ビット/ STDC ++ H.> 2 の#define MP(I、J)make_pair(I、J) 3。 の#define P対<整数、整数> 4。 使用した 名前空間STD; 5 CONST INT INF = 0x3f3f3f3f ; 6 CONST INT = 5E3 + MAXN 10 ;; 7。 int型N-、T; 8 int型DIS1 [MAXN]、CDIS [MAXN]; 9 INT判事[MAXN]; // かどう走行単一始点最短ポイント(第2の最短)経路をマークするために使用 10ベクトル<P> E [MAXN]、VIS [MAXN]; 11 空隙ストレージ(int型 A、INT B、int型C) 12は 、{ 13は、 E [A] .push_back(融点(C、B)); // 同様マトリックスデポジット側は、第1素子MPは重量である; 14 } 15 空隙予約(int型X) 16 { 17。 ための(INT I = 1 ; I <= N; I ++) // 単一ソースパスX更新; 18である VIS [X] .push_back(MP(I、CDIS [I]))。 19 } 20 空隙をDij(int型A) 21であり、 { 22は INT Wへ、 23である PRIORITY_QUEUE <P、ベクトル<P>、大<P >> Q。 // プライオリティキューは最小度に更新される 24 のmemset(DIS1、INF、はsizeof (DIS1)); 25 のmemset(CDIS、INF、はsizeof(CDIS)); //は、初期化 26である 27 q.push(MP(0、)); // 最初のエントリ・ポイント 28 DIS1 [A] = 0 ; 29 30 しばらく!(q.empty()){ 31は P = U q.top(); 32 q.pop()。 33は、 IF(u.first> CDIS [u.second]) // この点の値は、その短絡よりも大きい場合、これは、最適化の一つである 34であり 続ける ; //就跳过 35 用(INTは iは= 0 ; I <E [u.second] .size()を; ++ I){ 36の // DIS [V]> DIS [U] + W // 这里类似于这种; 37 INT次= E [u.second] [i]が1次回+ u.first。 // DIS W [U] +。 38 INT今= E [u.second] [I] .second。 // DIS [V]。 39 であれば(次の< DIS1 [今]){ 40 スワップ([今] DIS1、NEXT)。 41 q.push(MP(今DIS1 [今])); 42 } 43 であれば(次の< CDIS [今]){ 44 スワップ(CDIS [今]次); 45 q.push(現在[今]融点(CDIS))。 46 } 47 } 48 } 49 本()。 50 } 51 のint main()の 52 { 53 のint M。 54 のscanf(" %D%D "、&N、&M)。 55 一方(M-- ){ 56 INT T1、T2、T3。 57 のscanf(" %D%D%D "、&T1、およびT2、およびT3)。 58 ストレージ(T1、T2、T3)。 59 } 60 のint Q。 61 のscanf(" %dの"、&Q)。 62 一方(q-- ){ 63 のint X、Y。 64 のscanf(" %D%D "、およびX&Y)。 65 であれば(!ジャッジ[X])をDij(X)、ジャッジ[X] = 1 。 66 のために(INT iは= 0 ; iが<VIS [X] .size(); I ++ ){ 67は、 もし(VIS [X] [i]が1次回== Y){ 68 であれば(VIS [X] [I]。二==INF) 69 のprintf(" NOルート\ nが" ); 70 他のprintf(" %dの\ n " 、VIS [X] [I] .second)。 71 ブレーク; 72 } 73 } 74 } 75 リターン 0 。 76 }