書式#include <cstdioを> する#include <iostreamの> の#include <CStringの> の#include <キュー> の#define N 100007 の#define Q千億七 名前空間stdを使用。 N INT、M、K、S、T、SPE [15]、TOT、LS [N]、CNT。 長い長いANS、DIS [N]、D [15] [15]。 ブールB [N]、V [40]。 キュー<整数> Q; 構造体縁{ 次に、W、にINT。 } E [N]。 インラインint型リード(){ int型、S = 0、W = 1。 チャーCH = GETCHAR()。 (CH < '0' || CH> '9'){一方 { - ( '' == CH)場合 ; = W -1 } CH = GETCHAR()。 } (CH> = '0' && CH <= '9')、一方{ S = Sで* 10 + CH-'0' 。 CH = GETCHAR()。 } 戻りS * W。 } ボイド追加(int型のx、int型のY、int型Z){ E [++ TOT] .TO = Y。 E [TOT] .W = Z。 E [TOT] .next = LSを[X]。 LS [X] = TOT。 } ボイドspfa(INT X){ memsetの(B、0、はsizeof(b)参照)。 {ための式(I ++はint型i = 1; iが<= N) DIS [i]は= Qと、 } DIS [X] = 0。 q.push(X)。 しばらく(!q.empty()){ int型は今= q.front(); q.pop(); {(; I I = E [i]は.next I =のLS [今] INT)のための IF(DIS [今] + E [I] .W <DIS [E [i]の.TO]){ DIS [E [I] .TO] = DIS [今] + E [I] .W。 IF(B [E [i]は.TO]!){ q.push(E [I] .TO)。 B [E [i]は.TO] = 1。 } } } B [今] = 0; } CNT ++。 以下のために(INT i = 1; iが<= K + 1; I ++){ IF(CNT = I!){ D [CNT] [I] =のDIS [SPE [I]]。 } } D [CNT] [K + 2] = DIS [T]。 } ボイドDFS(INTのDEP、長い長い和、int型DC){ IF(和+ D [DC] [K + 2]> ANS){ 返します。 } IF(DEP> = K + 1){ IF(和+ D [DC] [K + 2] <ANS){ ANS =和+ D [DC] [K + 2]。 } を返します。 } ため(INT I = 2、iは<= K + 1; I ++){ もし{(V [I]!) V [I] = 1。 DFS(DEP + 1、和+ D [DC] [i]は、I)。 V [I] = 0; } } } {)(メインINT )(N =読み取ります。 、M =(読み取り) K =リード()。 S =)は(読み取り、 T =読み取ります(); 以下のために(INT I = 1; I <= M; iは++){ int型のX、Y、Z。 X =リード()。 Y =読み取り(); Z =リード()。 (x、y、z)を加えます。 } ため(INT I = 2、iは<= K + 1; I ++){ SPE [i]が()読み取ります。=。 } SPE [1] = sで、 以下のために(INT i = 1; iが<= K + 1; I ++){ spfa(SPE [I])。 } ANS = Q。 DFS(1,0、S)。 IF(ANS <Q){ のprintf( "%のLLD"、ANS)。 } 他{ のprintf( " - 1")。 } }