#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<pair<int, int>> dp[10005]; //dp[x][k].fi = raspuns pentru subtree x, k noduri, timp minim, .second = timp minim ca sa ma si intorc in x
vector<pair<int, int>> adj[10005];
void dfs(int u, int p = 0) {
dp[u].push_back({0, 0}); //dp[u][0] nu are sens
dp[u].push_back({0, 0}); //dp[u][1] sunt deja in nodul 1
for (auto [v, cost] : adj[u]) {
if (v == p) continue;
dfs(v, u);
vector<pair<int, int>> newdp(dp[u].size() + dp[v].size() - 1, {1e18, 1e18});
//evitam edge caseuri cu j = 0, adica doar in subarb lui u
for (int i = 0; i < dp[u].size(); i++) {
newdp[i].first = dp[u][i].first;
newdp[i].second = dp[u][i].second;
}
for (int i = 1; i < dp[u].size(); i++) { //vizitez i noduri in subarb lui u curent
for (int j = 1; j < dp[v].size(); j++) { //vizitez j noduri in subarb lui v
int newk = i + j;
//daca ma duc mai intai in subarborele lui u si apoi in subarb lui v
if (dp[u][i].second + cost + dp[v][j].first < newdp[newk].first) {
newdp[newk].first = dp[u][i].second + cost + dp[v][j].first;
}
//acum daca ma duc mai intai in subarb lui v si apoi in subarb lui u
if (cost + dp[v][j].second + cost + dp[u][i].first < newdp[newk].first) {
newdp[newk].first = cost + dp[v][j].second + cost + dp[u][i].first;
}
//acum sa calculam .second
newdp[newk].second = min(newdp[newk].second, dp[u][i].second + 2 * cost + dp[v][j].second);
}
}
dp[u] = newdp;
}
}
signed main() {
int n, k, start;
cin >> n >> k >> start;
for (int i = 1; i < n; i++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
dfs(start);
cout << dp[start][k].first << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |