求调qwq
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define TLE \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define endl "\n"
#define sp system("pause")
const int inf = 0x3f3f3f3f;
const int INF = 0x7fffffff;
const ll infll = 0x3f3f3f3f3f3f3f3f;
const ll INFll = 0x7fffffffffffffff;
const int maxn = 1e3 + 5;
const double pi = acos(-1.0);
const double eps = 1e-5;
/*
有一棵苹果树,如果树枝有分叉,一定是分二叉(就是说没有只有一个儿子的结点)树根编号1
现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。
给定需要保留的树枝数量,求出最多能留住多少苹果。
*/
// 设dp[u][i]表示u的子树上保留i条边,至多保留的苹果数目
// dp[u][i] = max dp[u][i - j - 1] + dp[s][j] j in min(1~v(s).size,q) s in u->son
int n, q;
vector<pair<int, int>> v[maxn];
ll dp[1005][1005];
int siz[1005];
void dfs1(int u, int fa)
{
for (int i = 0; i < (int)v[u].size(); i++)
{
if (v[u][i].first != fa)
{
dfs1(v[u][i].first, u);
}
}
for (int i = 0; i < v[u].size(); i++)
{
for (int j = min(siz[u], q); j >= 0; j--)
{
for (int k = min(siz[v[u][i].second], j - 1); k >= 0; k--)
{
dp[u][j] = max(dp[u][j], dp[u][j - k - 1] + dp[v[u][i].first][k] + v[u][i].second);
}
}
}
return;
}
void dfs2(int u, int fa)
{
for (int i = 0; i < v[u].size(); i++)
{
if (v[u][i].first != fa)
{
dfs2(v[u][i].first, u);
}
}
siz[u] = 1;
for (int i = 0; i < v[u].size(); i++)
{
if (v[u][i].first != fa)
{
siz[u] += siz[v[u][i].first];
}
}
return;
}
int main()
{
cin >> n >> q;
for (int i = 1; i < n; i++)
{
int x, y, z;
cin >> x >> y >> z;
v[x].push_back(make_pair(y, z));
v[y].push_back(make_pair(x, z));
}
dfs2(1, -1);
// for (int i = 1; i <= n; i++)
// {
// cout << siz[i] << " ";
// }
// sp;
dfs1(1, -1);
cout << dp[1][q];
//sp;
return 0;
}