二叉苹果树
题目链接
code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair< int , int > pii;
typedef pair< ll, ll> pll;
const int INF = 0x3f3f3f3f ;
const ll INFF = 0x3f3f3f3f3f3f3f3f ;
const ll MOD = 1e9 + 7 ;
const int M = 1e6 + 5 ;
const int N = 1e5 + 5 ;
int n, q;
int dp[ 200 ] [ 200 ] ;
struct edge
{
int v, w, next;
} e[ 400 ] ;
int head[ 200 ] , cnt;
void add_edge ( int u, int v, int w)
{
e[ cnt] = { v, w, head[ u] } ;
head[ u] = cnt++ ;
}
void dfs ( int u, int fa)
{
for ( int i = head[ u] ; ~ i; i = e[ i] . next)
{
int v = e[ i] . v;
if ( v == fa)
continue ;
dfs ( v, u) ;
for ( int j = q; j >= 1 ; j-- )
{
for ( int k = 1 ; k <= j; k++ )
{
dp[ u] [ j] = max ( dp[ u] [ j] , dp[ u] [ j - k] + dp[ v] [ k - 1 ] + e[ i] . w) ;
}
}
}
}
int main ( )
{
#ifdef LZH_LOCAL
freopen ( "in.in" , "r" , stdin ) ;
#endif
ios:: sync_with_stdio ( 0 ) , cin. tie ( 0 ) , cout. tie ( 0 ) ;
memset ( head, - 1 , sizeof ( head) ) ;
cin >> n >> q;
for ( int i = 1 ; i < n; i++ )
{
int u, v, w;
cin >> u >> v >> w;
add_edge ( u, v, w) ;
add_edge ( v, u, w) ;
}
dfs ( 1 , 0 ) ;
cout << dp[ 1 ] [ q] << endl;
return 0 ;
}