bzoj4033-ツリーDP

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <cmath>
 4の#include < 文字列 >
 。5の#include <CStringの>
 6の#include <アルゴリズム>
 7。の#include <iomanip>
 8。 使用した 名前空間STD;
 9  // F [i]の[t]は、私はtは利益ルートサブツリー黒のドットで表現される
 10  //は各エッジについて計算貢献を考えてみます。また、このエッジを含まれているいくつかのポイントがパス上にあります。
。11  // F [X] [J + T] = MAX(F [X] [J + T]、F [X] [J] + F [Y] [T] +(ロングロング)エッジ[I]。 * DIS(T *(KT)+(サイズ[Y] -t)*(NK-(サイズ[Y] -t))));
 12れる // 更新されたサイズ[X] 
13であり 、名前空間Moxing {
 14     const  int型 N = 2005 ;
15      int型 N、K、最後[N]、CNT、サイズ[N]、息子[N << 1 ]。
16      長い 長いF [N]、[N]。
17      構造体ノード{
 18          INT 、DIS、NXTに、
19      }エッジ[N << 1 ]。
20      ボイド追加(INT  からINTに、int型のDIS){
 21          エッジ[++ CNT] .TO =に、エッジ[CNT] .DIS = DIS、エッジ[CNT] .nxt = [最後から [、]最後から ] = CNT。
22      }
 23      空隙DFS(int型のx、int型FA){
 24      //     [X] [0] Fを= F [X] [1] = 0; 
25          サイズ[X] = 1 26          のためには、int型 ; I I = I =最後[X] {エッジ[I] .nxt)
 27              のint Y = エッジを[I] .TO。
28              であれば(Y == FA)続けます29の             DFS(Y、X)。
30              のためにINT ; J> = J =分(K、サイズ[X])0 ; j-- ){
 31                  INT)T =分(KJ、サイズ[Y]; T> = 0 &&(J + T)<= K; T - ){ //J + T <= K - > T <= KJ 
32                      F [X] [J + T] = MAX([X] [J + T]、[X] [j]はF + F [Y] F [T] +(長い 長い)エッジ[I] .DIS *(T×(KT)+(サイズ[Y] -t)*(NK-(サイズ[Y] - T))))。
33                  }
 34              }
 35              サイズ[X] + = サイズ[Y]。
36          }
 37      } 
 38      構造体メイン{
 39          メイン(){
 40              のscanf(" %D%dの"、&​​N&K)。
41              のためにint型 I = 1 ; I <= N- 1 ; iが++ ){
42                  int型 から、DIS、へ。
43                  のscanf(" %D%D%D "、&から&に、&​​、DIS)。
44                  (追加(に追加、DISに)からDIS)。
45              }
 46の              DFS(11 )。
47              のprintf(" %LLDする\ n " F、[ 1 ] [K])。
48              出口(0 );
49          }
 50      } UniversalLove。
51  } 
52  INT (){主
 53      Moxing ::メイン()。
54 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/Moxingtianxia/p/11360384.html