貪欲な木のDP + + + --cf1241E(良いタイトル)をソートするインクリメンタル方式

/ * 
ツリーが与えられ、各ノードkが最もその関連するサイドバーから選択され、右側には、ポリシーを作成するように求め、最大

DPは、[U]は[0 | 1 ] |もUは、親側に接続されていない表します場合親サブツリーUは最適なソリューションを左右
{DP [V] u及び息子の任意のエッジに接続されていないが、その後、U下で進行した場合TOTは合計= [0]} 
今、我々は、Uが接続されている息子vを選択しますその後、インクリメントtotが[V] [1 DV = DPである W [0] + [V]] -DP; 

DP [U]を評価すると、[0]、我々は接続息子をk個まで選択することができ、その後、すべて置きますDVソートし、次いでKの前部が0より大きい見つける
DP [U] [1]同様に、それらは、K-1に息子であれば
* / 
の#include <ビット/ STDC ++。H> 
の#include <ベクトル>
 使用して 名前空間STD;
 の#define N 500 005
 の#define LLロングロング
 
ベクトル <ペア<LL、LL >> G [N];
 int型N-、K; 
LL DP [N] [ 2 ]; 

int型CMP(LL、LL B)を{
     戻り A> B。
} 

ボイド DFS(INT U、INT PRE){ 
    LLのTOT = 0 
    ベクター <LL> D; d.clear()。
    (オートP:G [U]){
         int型 V = p.first。
        もし(V ==前)続けます
        DFS(V、U); 
        d.push_back(DP [V] [ 1 ] -dp [V] [ 0 ] + p.second)。
        TOT + = DP [V] [ 0 ]。
    } 
    ソート(d.begin()、d.end()、CMP)。
    // 求出DP [U] [0] 
    DP [U]は[ 0 ] = TOTを、
    ためにint型 i = 0 ; iが<分(K、(INT)d.size()); iは++ 場合(Dの[I]> 0)DP [U] [ 0 ] + = D [i]は、
    // 求出DP [U] [1] 
    DP [U]は[ 1 ] = TOTを、
    以下のためにint型 i = 0 ; iが<分(K- 1を、(INT)d.size()); iは++ 場合(D [i]が> 0)DP [U] [ 1 ] + = D [i]は、
    
} 
             
ボイドのinit(){
     ためint型 I = 1;私は++; iが<= N )G [i]が.clear();
    以下のためにint型 i = 1 ; iが<= N; iは++)DPを[I]が[ 0 ] = DP [I] [ 1 ] = 0 ; 
} 
             
int型のmain(){
     int型の Q; CIN >> Q。
    一方、(q-- ){ 
        INIT()。
        CIN >> N >> K。 
        以下のためにint型 i = 1 ; iがn <I ++は{)
             int型、U、V、W; scanf関数(" %D%D%D "、&​​U&V、およびW)を。
            G [U] .push_back(W make_pair(V))。
            G [V] .push_back(make_pair(U、W))。
        } 
        
        / * {ため(iは++; iがn = <I = 1 INT) 
            :(G [i]がオートV)のために
                COUT << v.first <<」「。
            プット( ""); 
        } * / 
        
        DFS(10 ); 
        
        COUT << DP [ 1 ] [ 0 ] << ' の\ n ' ; 
    } 
}

 

おすすめ

転載: www.cnblogs.com/zsben991126/p/11700111.html