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(1、1 )。 47 のprintf(" %LLDする\ n " F、[ 1 ] [K])。 48 出口(0 ); 49 } 50 } UniversalLove。 51 } 52 INT (){主 53 Moxing ::メイン()。 54 }