二叉苹果树
题目链接

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;
}