Submission #341282

#TimeUsernameProblemLanguageResultExecution timeMemory
341282phathnvMuseum (CEOI17_museum)C++11
100 / 100
843 ms784884 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 10001;
const int INF = 1e9;

struct Tedge{
    int v, w;
    Tedge(int _v, int _w){
        v = _v;
        w = _w;
    }
};

int n, k, x, dp[N][N][2], sz[N], tmpDp[N][2];
vector <Tedge> adj[N];

void minimize(int &x, const int &y){
    if (x > y)
        x = y;
}

void dfs(int u, int p){
    sz[u] = 1;
    for(int i = 1; i <= n; i++)
        dp[u][i][0] = dp[u][i][1] = INF;
    dp[u][1][0] = dp[u][1][1] = 0;

    for(Tedge e : adj[u]){
        int v = e.v;
        int w = e.w;
        if (v == p)
            continue;
        dfs(v, u);

        for(int i = 1; i <= n; i++){
            tmpDp[i][0] = dp[u][i][0];
            tmpDp[i][1] = dp[u][i][1];
        }
        for(int a = 1; a <= sz[u]; a++)
            for(int b = 1; b <= sz[v]; b++){
                minimize(tmpDp[a + b][0], dp[u][a][1] + dp[v][b][0] + w);
                minimize(tmpDp[a + b][0], dp[u][a][0] + dp[v][b][1] + 2 * w);
                minimize(tmpDp[a + b][1], dp[u][a][1] + dp[v][b][1] + 2 * w);
            }

        sz[u] += sz[v];
        for(int i = 1; i <= n; i++){
            dp[u][i][0] = tmpDp[i][0];
            dp[u][i][1] = tmpDp[i][1];
        }
    }
}

void readInput(){
    cin >> n >> k >> x;
    for(int i = 1; i < n; i++){
        int u, v, w;
        cin >> u >> v >> w;
        adj[u].push_back(Tedge(v, w));
        adj[v].push_back(Tedge(u, w));
    }
}

void solve(){
    dfs(x, -1);
    cout << dp[x][k][0];
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    readInput();
    solve();
    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...