AC

许诺  •  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;

}


评论:

请先登录,才能进行评论