/ * ツリーが与えられ、各ノード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(1、0 ); COUT << DP [ 1 ] [ 0 ] << ' の\ n ' ; } }