トピック:https://vjudge.net/contest/323605#problem/A
問題の意味:最大重みが得られるように、あなたは、M-ポイント通信のブロックを選択することができますツリー
思考:ツリーバックパック、我々は各iはiについてのルートである場合、次に我々は根で得られたj番目のサブツリーノードの代表の最大値から選択される配列DP、DP [I] [j]を、使用しますm個のアイテム、および異なるサブツリーの異なるグルーピングができる限りがあるとして
#include <ビット/ STDC ++ H> に#define MAXN 105 の#define十億七MOD 使用して 名前空間STDを、 typedefの長い 長いLL。 INTのN、M。 int型DP [MAXN] [MAXN]。 int型D [MAXN]。 ベクター < INT > MP [MAXN]。 ボイド DFS(int型のx、int型F)は{ ため(int型 i = 0 ; iは融点を<[X] .size(); iは++ ){ int型、U = MP [X] [I]; もし(uは== f)を続ける。 DFS(U、X)を。 用(INT T = M; T> = 0 ; T-- ){//現在のノードの値を更新して得られた物品と、このサブツリー のために(INT J = T; J> = 0 ; J、){ IF(TJ> = 0 ){ DP [X] [T] = MAX(DP [X] [T]、DP [X] [TJ] + DP [U] [J]); } } } } IF(X! = 0 ){ ため(INT T = M; T> 0 ; T-- ){ DP [X] [T]が = DP [X] [T- 1 ] + } D [X]。 } } int型のmain(){ scanf関数(" %D%dの"、&N、&M)。 INT X、Y。 用(int型 iは= 1のscanf(; iが<= N I ++)は、 " %のD "、&D [I])。 以下のために(int型私= 0 ; iがN- < 1 ; iが++ ){ scanf関数(" %D%dの"、およびX&Y)。 MP [X] .push_back(Y)。 MP [Y] .push_back(X)。 } DFS(1 - 1 )。 COUT << DP [ 1 ] [M]。 }