明らか式DP、DPは、[X] [i]はエッジiはフリー最短到着時間点xを表します。
DP [X] [I] =分(DP [事前] [I - 1]、DP [事前] [I] + DIS [事前] [X])。
DP直接実行する場合は、前方のトポロジを入れて、統計情報には、リング上ではありませんしています。
層状のグラフを検討、そのテンプレートの階層図です。
(マップを描くホーム)
1の#include <cstdioを> 2の#include < ストリング > 3の#include <CStringの> 4の#include <キュー> 5の#include <アルゴリズム> 6 の#define INT長い長い 7 使って 名前空間STD。 8 int型リード(){ 9 INT X; scanf関数(" %のLLD "、&x)は、リターンのx; 10 } 11 12 のconst int型 N = 220005 。 13 14 のint N、M、K。 15 INTP1、P2、T。 16 17 構造体ノード{ 18 のint Y、Z、NXT。 19 } E [N * 20 ]。 20 のint TOT = 0 、H [N]。 21 ボイド広告(int型のx、int型の Y、int型Z){ 22 ++ TOT; E [TOT] .Y = Y; E [TOT] .Z = Z、E [TOT] .nxt = hの[X]; H [X] = TOTを、 23 } 24の 25 のint DIS VIS [N]、[N]。 26 PRIORITY_QUEUE <ペア< 整数、整数 >> Q。 27 ボイドをDij(){ 28 29 q.push(make_pair(0、1 ))。 30 ながら(!q.empty()){ 31 、INT X = q.top()第二; q.pop(); 32 であれば(VIS [X])続けます。 33 VIS [X] = 1 。 34 のために(int型 ; I I = I = H [X] {E [I] .nxt) 35 のint Y = E [I] .Y。 36 であれば(DIS [Y]> DIS [X] + E [I] .Z){ 37の DIS [Y] = DIS [X] + E [i]の.Z。 38 q.push(make_pair( - DIS [Y]、Y))。 39 } 40 } 41 } 42 } 43 44は、 主符号付き(){ 45 N =読み取る(); M =読み取る(); K = リード()。 46 一方(M-- ){ 47 、P1 = read()は、p2は= read()は、Tは。= 読み取ります(); 48 広告(P1、P2、T); AD(P1、P2、T)。 49 のための(int型 J = 1 ; J <= K; ++ j)は{ 50 広告(P1 + jを×n個、P2 + jを×n個、t)は、広告(P2 + jを×n個、P1 + jのの*のN、 T); 51 AD(N *(J- 1)+ P 1、N * jのの+ P2を、0); AD(N *(J- 1)+ P2、N * J + P1、0 )。 52 } 53 } 54 のmemset(DIS、0x3fを、はsizeof (DIS))。 55 のmemset(VIS、0、はsizeof (VIS))。 56の DIS [ 1 ] = 0 。 57 をDij()。 58 INT ANS = DIS [N]。 59 のために(int型 i = 1 ; iが= Kを<++ {i)が 60の ANS =分(ANS、DIS [N * iが+ n]を)。 61 } 62 のprintf(" %のLLDを"、年); 63 }
YY、TQLを直接階層図をzpj。