[USACO08JAN]電話回線の電話回線

【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 10 )){
 29の                     ?DIS [ENDD [K] = DIS [J] +(W [K]> X 10 )。
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 }

 

おすすめ

転載: www.cnblogs.com/66dzb/p/11567054.html