ある子供たちの質問[霧]
だから、難しいことではありません
木の貢献DPのシンプル右側
LONGLONGを開くには右サイドを与えませんでした
コードワットを見てもよいかのEMMの詳細
唯一の詳細は、おそらくあなたはWJ更新をしたいので、後方に再循環された最初であります
双方向側の配列...そして二回(開くことを忘れないでください
// 愛と自由。 #include <cstdioを> する#include <cmath> の#include <アルゴリズム> の#include <CStringの> に#define LL長い長 の#define INF 20021225 の#define N 2001 使用して 名前空間STDを、 構造体 EDG { INTに、LT、V;} E [N << 1 ]。 LL F [N]、[N]。INT CNT、で[N]、K、SZ [N]、N。 ボイド追加(int型のx、int型の Y、INT V) { E [ ++ CNT] .TO = Y。E [CNT] .LT = 中[バツ]; E [CNT] .V = V。で [X] = CNT。 E [ = xで.TO ++ CNT]。E [CNT] .LT = で [Y]。E [CNT] .V = V。で [Y] = CNT。 } ボイド DFS(int型のx、int型FA) { SZ [X] = 1。memsetの([x]は、F - 1、はsizeof(F [X]))。F [X] [ 0 ] = F [X] [ 1 ] = 0 ; 以下のために(int型私は= で [X]; I; I = E [I] .LT) { int型、Y = E [i]を.TO、V = E [I] .V。もし(Y == FA) 続行; DFS(Y、X)。SZ [X] + = SZ [Y]。INTトップ= 分(K、SZ [X])。 用(INT W =頂;〜W; w-- ) のための(int型 J = 0 ; J <=分(W、SZ [Y]); J ++ ) { 場合(F [X] [WJ] == - 1) 継続; F [X] [W] = MAX(F [X]、[W] [X] [WJ] + F [Y] [J] + 1LL * V×(SZ [Y] -j)*(F N- SZ [Y] -k + J)+ 1LLの*のV *のJ×(K- J))。 } } } int型のmain() { scanf関数(" %D%dの"、&N&K)。int型X、Y、V。 以下のために(int型 i = 1 ; iがn <I ++の) のscanf(" %D%D%D "、およびX&Yを、&V)、追加(X、Y、V)。 DFS(1、1 )。 printf(" %LLDする\ n "、F [ 1 ] [K])。 リターン 0 ; }
ます。https://www.cnblogs.com/hanyuweining/p/11075942.htmlで再現