【TimeGate】
https://www.luogu.org/problem/P1948
[問題解決のアイデア]
この問題の解決:半分の答え+ spfa
【コード】
1の#include <cstdioを> 2の#include <CStringの> 3の#include <cmath> 4の#include <アルゴリズム> 5 使って 名前空間STD。 6 int型 A、B、L、C、I、J、K、N、K、P、中間、NXT [ 20005 ]、T = 0 [W、20005 ]、H [ 20005 ]、[ENDD 20005を ]、DIS [ 20005 ]、ANS、leftt、rightt。 7 ブール lastt [ 20005 ]、[OK]。 8 ボイド追加(int型 U、int型 V、int型X){ 9 T ++ 。 10 NXT [T] =をH [U]。 11 時間[U]は=のT。 12 [T] = WをX。 13 ENDD [T] = V。 14 } 15 BOOL SPFA(INT X){ 16 用(i = 1 ; iが<= N; iは++ ){ 17 lasttを[I] = 偽。 18の DIS [I] = 1 << 30 。 19 } 20 = OK 真。 21の DIS [ 1 ] = 0、lastt [ 1 ] =真; 22 一方(OK){ 23 = OK 偽。 24 のために(J = 1 ; J <= N; J ++ ) 25 場合(lastt [J] == 真){ 26 lastt [j]は= 偽。 27 のための - (!K = k個= hの[J] 1 ; = K NXT [K]) 28の 場合?(DIS [k]をENDD]> DIS [J] +(W [K]> X 1:0 )){ 29の ?DIS [ENDD [K] = DIS [J] +(W [K]> X 1:0 )。 30 lastt = [K] ENDD] 真。 31 [OK] = 真; 32 } 33 } 34 } 35の 場合(DIS [N] == 1 << 30 ){ 36 のprintf(" -1の\ n " ); 37 出口(0 ); 38 } 39 リターン DIS [N] <= K。 40 } 41 INT メイン(){ 42 // freopenは( "telephone.in"、 "R"、STDIN)。 43 // freopenは( "telephone.out"、 "W"、STDOUT)。 44 のscanf(" %D%D%D "、&N、&P&K)。 45 のmemset(NXT、 - 1、はsizeof (NXT))。 46 のために(i = 1 ; I <= P、iは++ ){ 47 のscanf(" %D%D%D "、&、&B、&L)。 48 追加(A、B、L)。 49 追加(B、L)。 50 場合(L> rightt)rightt = L。 51 } 52 leftt = 0 。 rightt){ 54 半ば=(leftt + rightt)/ 2 。 55 であれば(SPFA(MID))rightt = ミッド。 56 他 leftt =ミッド+ 1 ; 57 } 58 のprintf(" %d個の\ n " 、rightt)。 59 / * ため(i = 1; iが<= N; I ++) 60 のprintf( "%D%D \ n"は、I、SPFA(I))。 61 * / 62 戻り 0 ; 63 }