简单树形DP
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define INF 0xfffffff
int dp[][];
int n,q,ch[][];
int p[][];
int dfs(int pre,int u,int s)
{
int i;
if(dp[u][s]!=-)
return dp[u][s];
int o = ,cc[];
for(i = ; i <= n ; i++)
{
if(i==pre)
continue;
if(p[u][i])
{
o++;
cc[o] = i;
}
}
if(s==||o==)
return dp[u][s] = ;
if(o==&&s>)
return -INF;
if(o==)
{
dp[u][s] = p[u][cc[]]+dfs(u,cc[],s-);
return dp[u][s];
}
dp[u][s] = max(p[u][cc[]]+dfs(u,cc[],s-),p[u][cc[]]+dfs(u,cc[],s-));
for(i = ; i < s ; i++)
{
dp[u][s] = max(p[u][cc[]]+dfs(u,cc[],i-)+p[u][cc[]]+dfs(u,cc[],s-i-),dp[u][s]);
}
return dp[u][s];
}
int main()
{
int i,u,v,w;
memset(dp,-,sizeof(dp));
scanf("%d%d",&n,&q);
for(i = ; i < n ; i++)
{
scanf("%d%d%d",&u,&v,&w);
p[u][v] = w;
p[v][u] = w;
}
int ans = dfs(-,,q);
printf("%d\n",ans);
return ;
}