Submission #1153455

#TimeUsernameProblemLanguageResultExecution timeMemory
1153455spycoderytMuseum (CEOI17_museum)C++20
100 / 100
515 ms785144 KiB
// start 5:17
#include <bits/stdc++.h>
#define f first
#define s second
using namespace std;
const int N = 10005;
int sz[N];
vector<pair<int,int> > A[N];
int dp[2][N][N];
int n,k,x,a,b,c;
void dfs(int u,int par = -1) {
    dp[1][u][1] = dp[0][u][1] = 0;
    sz[u]=1;
    for(auto [nxt,w] : A[u]) if(nxt!=par){
        dfs(nxt,u);
        for(int i = min(k,sz[u] + sz[nxt]);i>=2;i--) {
            for(int j = min(i-1,sz[nxt]);j>=max(1,i-sz[u]);j--){
                dp[1][u][i] = min({
                    dp[1][u][i],
                    dp[0][u][i-j] + dp[1][nxt][j] + w,
                    dp[1][u][i-j] + dp[0][nxt][j] + 2 * w
                });
                dp[0][u][i] = min({
                    dp[0][u][i],
                    dp[0][u][i-j] + dp[0][nxt][j] + 2 * w
                });
            }
        }
        sz[u] += sz[nxt];
    }
}
int main() {
    cin>>n>>k>>x;
    for(int i = 0;i<n-1;i++) {
        cin>>a>>b>>c;
        A[a].push_back({b,c});
        A[b].push_back({a,c});
    }
    for(int i = 0;i<N;i++) for(int j = 0;j<N;j++) dp[0][i][j] = dp[1][i][j] = 1e9;
    dfs(x);
    cout<<dp[1][x][k];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...