Submission #1246507

#TimeUsernameProblemLanguageResultExecution timeMemory
1246507julia_08Museum (CEOI17_museum)C++20
100 / 100
568 ms784884 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e4 + 10;

int sub[MAXN];

int dp[MAXN][MAXN][2], min_dp[MAXN][MAXN];

vector<pair<int, int>> adj[MAXN];

int n, k, x;

void init(int v){

  sub[v] = 1;

  for(int i=0; i<=n; i++) dp[v][i][0] = dp[v][i][1] = 1e9;

  dp[v][0][0] = dp[v][1][0] = 0;
  dp[v][0][1] = dp[v][1][1] = 0;

}

void merge(int u, int w, int v){

  for(int i=sub[v]; i>=0; i--){
    for(int j=sub[u]; j>=0; j--){
      dp[v][i + j][1] = min(dp[v][i + j][1], dp[v][i][1] + dp[u][j][1] + 2 * w);
      dp[v][i + j][0] = min(dp[v][i + j][0], dp[v][i][0] + dp[u][j][1] + 2 * w);
      dp[v][i + j][0] = min(dp[v][i + j][0], dp[v][i][1] + dp[u][j][0] + w);
    }
  }

  sub[v] += sub[u];

}

void dfs(int v, int p){

  init(v);

  for(auto [u, w] : adj[v]){
    if(u != p){
      dfs(u, v);
      merge(u, w, v);
    }
  }

}

int main(){
  cin.tie(0)->sync_with_stdio(0);

  cin >> n >> k >> x;

  for(int i=1; i<n; i++){
    int a, b, c; cin >> a >> b >> c;
    adj[a].push_back({b, c});
    adj[b].push_back({a, c});
  }

  dfs(x, x);

  cout << dp[x][k][0] << "\n";

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...