フェイス質問
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 = - 1。LLの心= 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 ; }