# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1139462 | stefdasca | Museum (CEOI17_museum) | C11 | 0 ms | 0 KiB |
#include <iostream>
#include <vector>
using namespace std;
int n, k, x;
int dp[2][10002][10002];
int xtr[10002][10002];
vector<pair<int, int>> v[10002];
vector<int> dp2[2][10002];
vector<int> xtr2[2][10002];
vector<bool> viz2[2][10002];
int sts[10002];
void dfs(int parent, int node, int cost) {
sts[node] = 1;
for (int i = 0; i < (int) v[node].size(); ++i) {
int vecin = v[node][i].first;
if (vecin == parent)
continue;
dfs(node, vecin, v[node][i].second);
sts[node] += sts[vecin];
}
dp2[0][node].resize(sts[node] + 2, 0);
dp2[1][node].resize(sts[node] + 2, 0);
xtr2[0][node].resize(sts[node] + 2, 0);
xtr2[1][node].resize(sts[node] + 2, 0);
viz2[0][node].resize(sts[node] + 2, 0);
viz2[1][node].resize(sts[node] + 2, 0);
viz2[0][node][1] = 1;
sts[node] = 1;
for (int i = 0; i < (int) v[node].size(); ++i) {
int vecin = v[node][i].first;
if (vecin == parent)
continue;
int edcost = v[node][i].second;
for (int j = min(k, sts[node]); j >= 1; --j)
for (int sz = 1; sz <= min(sts[vecin], k - j); ++sz) {
if (!viz2[1][node][j + sz] || dp2[0][node][j] + dp[1][vecin][sz] + edcost < dp2[1][node][j + sz]) {
dp2[1][node][j + sz] = dp2[0][node][j] + dp[1][vecin][sz] + edcost;
viz2[1][node][j + sz] = 1;
xtr2[1][node][j + sz] = xtr[vecin][sz];
}
else {
if (dp2[0][node][j] + dp[1][vecin][sz] + edcost == dp2[1][node][j + sz]) {
xtr2[1][node][j + sz] = min(xtr2[1][node][j + sz], xtr[vecin][sz]);
}
}
for (int trb = 0; trb <= 1; ++trb) {
if (!viz2[trb][node][j + sz] ||
dp2[trb][node][j] + dp[0][vecin][sz] + 2 * edcost < dp2[trb][node][j + sz]) {
dp2[trb][node][j + sz] = dp2[trb][node][j] + dp[0][vecin][sz] + 2 * edcost;
viz2[trb][node][j + sz] = 1;
xtr2[trb][node][j + sz] = xtr2[trb][node][j];
}
else if (dp2[trb][node][j] + dp[0][vecin][sz] + 2 * edcost == dp2[trb][node][j + sz]) {
xtr2[trb][node][j + sz] = min(xtr2[trb][node][j + sz], xtr2[trb][node][j]);
}
}
}
sts[node] += sts[vecin];
}
for (int i = 2; i <= min(k, sts[node]); ++i) {
dp[1][node][i] = dp2[1][node][i];
xtr[node][i] = xtr2[1][node][i];
dp[0][node][i] = dp2[0][node][i];
}
for (int i = 1; i <= min(k, sts[node]); ++i)
xtr[node][i] += cost;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> k >> x;
for (int i = 1; i < n; ++i) {
int a, b, c;
cin >> a >> b >> c;
v[a].push_back({b, c});
v[b].push_back({a, c});
}
dfs(0, x, 0);
cout << dp[1][x][k] << '\n';
return 0;
}