许诺 • 10天前
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge {
int to;
int weight;
Edge(int t, int w) : to(t), weight(w) {}
};
vector<vector> tree; vector<vector> dp;
void dfs(int u, int parent) {
for (const Edge& edge : tree[u]) {
int v = edge.to;
if (v == parent) continue;
dfs(v, u);
for (int q = dp[u].size() - 1; q >= 0; --q) {
for (int k = 0; k <= q; ++k) {
if (k < dp[v].size() && dp[u][q - k] != -1 && dp[v][k] != -1) {
int candidate = dp[u][q - k] + dp[v][k] + edge.weight;
if (q + 1 < dp[u].size()) {
if (dp[u][q + 1] < candidate) {
dp[u][q + 1] = candidate;
}
}
}
}
}
}
}
int main() {
int N, Q;
cin >> N >> Q;
tree.resize(N + 1);
for (int i = 0; i < N - 1; ++i) {
int u, v, w;
cin >> u >> v >> w;
tree[u].emplace_back(v, w);
tree[v].emplace_back(u, w);
}
dp.resize(N + 1, vector<int>(Q + 1, -1));
for (int i = 1; i <= N; ++i) {
dp[i][0] = 0;
}
dfs(1, -1);
cout << dp[1][Q] << endl;
return 0;
}
评论:
请先登录,才能进行评论