ZJOI2006物流、輸送[]

フェイス質問

https://www.luogu.org/problem/P1772

問題の解決策

// luogu-判定部有効-O2 
の#include <cstdioを> 
する#include <iostreamの> 
の#include <CStringの> 
の#include <キュー> 
の#include <ベクトル>
 の#define LL長い長い
 の#define里レジスタint型
 の#define N 105
 の#define INF 100000000000000007LL 使用して名前空間はstdを、int型N、M、K、E。
INT D [N]、[N]。
LLをF [N]。
LL DIS [N]。BOOL 使用VIS [N]、[N] [N]。
LL分(LL、LLのB){ 場合(<B)を返します他のリターンB; 
}

 




   

LLのをDij(int型 L、INT R){
   BOOLのカント[N]。
  memset(カント、0はsizeof (カント))。
  
  (RI I = 1; I <= R; I ++ のための(RI J = 1 ; J <= Mであり、j ++)場合(使用[I] [J])カント[J] = 1 

  memset(DIS、0x3fをはsizeof (DIS))。
  memsetの(VIS、0はsizeof (VIS))。
  
  DIS [ 1 ] = 0 ; VIS [ 1 ] = 1 (RI i = 1 ; I <= M; iは++)もし(!カント[i])とDIS [I] =分(DIS [i]は、D [ 1 ] [I])。
  
  (RI I = 2 ; I <= M; I ++ ){
     int型 P = - 1LLの心= INF。
    (RI J = 1 ;; J <= M J ++)の場合(!!カント[J] && VIS [J] && DIS [J] <心)心= DIS [J]、P = J;
    もし(のp == - 1ブレーク
    VIS [P] = 1 (RI J = 1 ; J <= M J ++)場合(カント[J] && DIS [P] + D [P] [J] <DIS [J]!)DIS [J] = DIS [P] + D [P] [J]。
  } 
  
  もし(DIS [M]> INF)返すINFを。
  戻りDIS [m]を。
} 
int型のmain(){
   int型yourd、A、B、C。
  scanf関数(" %D%D%D%D "、&​​N、&M、およびK&E)。
  memsetの(D、0x3fをはsizeof (d)参照)。
  (RI i = 1 ; iは= Eを<I ++は{)
    のscanf(" %D%D%D "、&​​、&B、&C)。
    D [A] [B]、D [B] [A] = = 分(D [A] [B]、c)を、
  } 
  のscanf(" %dの"、&yourd)。
  (RI i = 1 ; iは<){ 
    scanf関数(" %D%D%D "、&​​A、&B、&C)。
    (; I <= Cであり; R iは、bは= I ++)は、[I]を用い、[A] = 1 
  } 
  のmemset(F、0x3fをはsizeof (F))。
  F [ 0 ] = - kは、
  (RI i = 1 ; I <= N; I ++ のための(RI J = 0 ; J <I、J ++)F [I] =分([I]、F [J] +(IJ)*をDij F( J + 1、I)+ K)。
  COUT << F [N] << ENDL。
  リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/shxnb666/p/11277989.html