#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <algorithm>
#include <cassert>
#include <cstring>
using namespace std;
const int N = 10001;
int n , k , root;
vector<pair<int , int > > adj[N];
int f[N][N][2];
int sz[N];
void dfs(int u , int father){
sz[u] = 1;
f[u][1][0] = f[u][1][1] = 0LL;
for(int i = 0 ; i < adj[u].size() ; i++){
int v = adj[u][i].first;
int cost = adj[u][i].second;
if(v == father){
continue;
}
dfs(v, u);
int g[N][2];
for(int j=0;j<=k;j++){
g[j][0]=g[j][1]=1e9 + 7;
}
for(int i = sz[u] ; i >= 0 ; i-- ){
for(int j = sz[v] ; j >= 0 ; j--){
g[i + j][0] = min(g[i + j][0] , f[u][i][1] + f[v][j][0] + cost);
g[i + j][0] = min(g[i + j][0] , f[u][i][0] + f[v][j][1] + 2 * cost);
g[i + j][1] = min(g[i + j][1] , f[u][i][1] + f[v][j][1] + 2 * cost);
}
}
sz[u] += sz[v];
for(int i = 1; i <= sz[u] ; i++){
f[u][i][0] = min(f[u][i][0] , g[i][0]);
f[u][i][1] = min(f[u][i][1] , g[i][1]);
}
}
}
int main(){
cin >> n >> k >> root;
for(int i = 1; i < n ; i++){
int u , v ;
int cost;
cin >> u >> v >> cost;
adj[u].push_back(make_pair(v, cost));
adj[v].push_back(make_pair(u , cost));
}
for(int i = 1; i <= n ; i++){
for(int j = 1; j <= n ; j++){
f[i][j][0] = f[i][j][1] = 1e9 + 7;
}
}
dfs(root, -1);
cout << f[root][k][0];
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... |