[] USACO09FEBは刷新トレイルをリメイク

リンク

明らか式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(01 ))。
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。

おすすめ

転載: www.cnblogs.com/chiyo/p/11434243.html