1つの#include <ビット/ STDC ++ H> 2 の#define INF 2147483647 3 使用して 名前空間STDを、 4 int型 N、M、U、V、S、F [ 10005 ]、E [ 10005 ]、ヘッド[ 1000500 ]、D [ 10005 ]、ANS、TOT、L、R。 5 ボイド入力(){ 6 freopenは(" INPUT.TXT "、" R " 、STDIN)。 7 // freopenは( "output.txtと"、 "W"、STDOUT); 8 } 9 構造体A { 10 int型V、W、次。 11 }のLU [ 1000500 ]。 12 ボイド追加(int型のx、int型の Y、int型Z){ 13 のLU [++ TOT] .V = Y。 14 LU [TOT] .W = Z。 15 LU [TOT] .next = 頭部[X]。 16 頭[X] = TOT。 17 } 18 空隙リード(){ 19 int型A、B、C。 20 のscanf(" %D%D%D%D%D "、&N、&M、およびU、およびV&S)。 21 のために(INT I = 1; I <= N。I ++ ){ 22 のscanf(" %dの"、&F [I])。 23 E [I] = Fを[I]。 24 } 25 ソート(E + 1、E +はN + 1 )。 26 のために(int型 I = 1を iが++; I <= M {) 27 のscanf(" %D%D%D "、&、&B、&C)。 28 追加(A、B、C)。 29 追加(B、C)。 30 } 31 } 32両端キュー< INT> Q; 33 ブール spfa(長い 長いミネソタ州){ 34 のための(int型 I = 0 ; iが<= N; iが++)D [I] = INF。 35 q.push_back(U)。 36 Dは、[U] = 0 。 37 一方(q.size()){ 38 INT今= q.front()。 39 q.pop_front()。 40 であれば(> [今] F ミネソタ州) 41 続けます。 42 のために(int型 I =ヘッド[今]; Iを、I = LUの[I] .next){ 43 もし(F [LUの[I] .V]> ミネソタ州) 44 続けます。 45 であれば(D [LUの[I] .V]> D [今] + LUの[I] .W){ 46 D [用のLU [i]は.V] = D [今] + LU [I] .W。 47 であれば(q.size()&& <D [i]は.V LUの[] D [q.front()]) 48 q.push_front(LUの[I] .V)。 49 他 50 q.push_back(LU [i]は.V)。 51 } 52 } 53 } 54 リターン D [V] <=のS。 55 } 56 空隙ワーク(){ 57 int型、L = 1、R = N。 58 一方(L <= R){ 59 のint J =(L + R)>> 1 。 60 であれば(spfa(E [J])){ 61の ANS = E [J]。 62 R = J - 1 。 63 } そうでなければ 64 、L = J + 1 。 65 } 66 であれば(ANS == 0 ) 67 のprintf(" -1の\ n " ); 68 他 69 printf(" %d個の\ n " 、ANS)。 70 } 71 INT メイン(){ 72 // 入力()。 73 リード()。 74 ワーク()。 75 リターン 0 ; 76 }