HihoCoder 1055ペイント(木リュックサック)

トピック:https://vjudge.net/contest/323​​605#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]。
}

 

おすすめ

転載: www.cnblogs.com/Lis-/p/11443415.html