これは、単一のソース最短に、ポイントを考えていない構築されています。
その後、それは問題ダイクストラ水になります。
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 typedefの長い 長いLL。 const int型のmod = 998244353 ; const int型 MAXN = 1E3 + 50 。 const int型 INF = 0x3f3f3f3f 。 構造体P { int型、にV。 P(){} P(INT TTO、INT VV){= TTOに; V = VV;} }。 ベクター <P> P [MAXN]。 ストラクト{アップ ブール 演算子()(CONST、P&P1CONST P&P2)のconst { 戻り p1.v> p2.v;} }。// 单调递增 // に星のコスト(QUE [] V。)(QUE []へ。); int型vpoi [MAXN]。 LL DIS [MAXN]、N、MAXVAL。 ボイドをDij(int型の) { PRIORITY_QUEUE <アップP、ベクトル<P>、> QUE。 memset(DIS、INF、はsizeof (DIS))。 int型I、J。 INT VIS [MAXN]、プリ[MAXN]、K。 Pポイ。 用(i = 1 ; iが<= N; iは++)VIS [I] = Sを、予め[I] = 0 ; 以下のための(I = 0;私は、pを<S] .size(); iは++ ) { DIS [P [S] [I] .TO] = P [S] [I] .V。 que.push(P(P [S] [I] .TO、DIS [P [S] [I] .TO]))。 } DIS [S] = 0 ; VIS [S] = 1 ;予め[S] = 0 ; 用(i = 1 ; iがn <; iは++ ) { POI = que.top(); que.pop()。 一方、(!DIS [poi.to] = poi.v || VIS [poi.to])// 失效或已访问 { POI = que.top(); que.pop()。 } K = poi.to; VIS [K] = 1 。 用(J = 0 ; J <P [k]は.size(); J ++ ) { 場合(VIS [P [k]は[J] .TO] && DIS [P [k]は[J] .TO]!> DIS [ K] + P [k]は[J] .V) { DIS [P [k]は[J] .TO] = DIS [K] + P [k]は[J] .V。 プレ[P [k]は[J] .TO] = K。 que.push(P(P [k]は[J] .TO、DIS [P [k]は[J] .TO]))。// 更新 } } } MAXVAL = 0 。 用(i = 1 ; iが<= N; iは++ ) { 場合(MAXVAL <DIS [i])とMAXVAL = DIS [i]は、 } } int型メイン() { LLのT。 scanf関数(" %のD "、&T)。 一方、(T-- ) { int型I、J、U、V、W。 INT V、E、S、K、C、ID [MAXN] [MAXN]、[MAXN] kは、 memsetの(ID、 - 1、はsizeof (ID))。 ANS2、ANS1 LL; scanf関数(" %D%D%D%D%D "、&V、&E、&S、&K&C);; 用(i = 1 ; iは= V + < 1 ; I ++ )Pを[I] .clear(); 用(i = 1 ; iは= Kを<; iは++)のscanf(" %dの"& K [i])と、 のための(i = 1 ; iが= Eを<; Iは++ ) { scanf関数(" %D%D%D "、&U&V、およびW) であれば(ID [U] [V ] == - 1 ) { ID [U]は[V] = P [U]は.size(); P [U]は.push_back(P(V、W)); ID [V] [U]は = P [V ] .size(); P [V] .push_back(P(U、W)); 続ける; } もし(P [U] [ID [U] [V]、V <= W)続ける; P [U ] [ID [U] [V]、V。 = W; P [V] [ID [V] [U] V = W。 } N = V。 Dij(S); ANS1 = MAXVAL。 N = V + 1 。 用(i = 1 ; iは= Kを<; iは++ ) { P [V + 1 ] .push_back(P(K [i]が、0 )); 。P [K [I]一back(P(V + 1、0 ))。 } をDij(V + 1); ANS2 = MAXVAL。 // のprintf( "##%LLD%LLD \ n"は、ANS1、ANS2)。 もし(ANS1 <= ANS2 * C)のprintf(" %LLDする\ n "、ANS1)。 他のprintf(" %LLDの\ nを" 、ANS2)。 } }