Submission #1139463

#TimeUsernameProblemLanguageResultExecution timeMemory
1139463stefdascaMuseum (CEOI17_museum)C++20
100 / 100
628 ms592868 KiB
#include <iostream>
#include <vector>

using namespace std;

int n, k, x;
int dp[2][10002][10002];
int xtr[10002][10002];

vector<pair<int, int>> v[10002];

vector<int> dp2[2][10002];
vector<int> xtr2[2][10002];
vector<bool> viz2[2][10002];
int sts[10002];
void dfs(int parent, int node, int cost) {
    sts[node] = 1;
    for (int i = 0; i < (int) v[node].size(); ++i) {
        int vecin = v[node][i].first;
        if (vecin == parent)
            continue;
        dfs(node, vecin, v[node][i].second);
        sts[node] += sts[vecin];
    }

    dp2[0][node].resize(sts[node] + 2, 0);
    dp2[1][node].resize(sts[node] + 2, 0);

    xtr2[0][node].resize(sts[node] + 2, 0);
    xtr2[1][node].resize(sts[node] + 2, 0);

    viz2[0][node].resize(sts[node] + 2, 0);
    viz2[1][node].resize(sts[node] + 2, 0);

    viz2[0][node][1] = 1;
    sts[node] = 1;
    for (int i = 0; i < (int) v[node].size(); ++i) {
        int vecin = v[node][i].first;
        if (vecin == parent)
            continue;
        int edcost = v[node][i].second;
        for (int j = min(k, sts[node]); j >= 1; --j)
            for (int sz = 1; sz <= min(sts[vecin], k - j); ++sz) {
                if (!viz2[1][node][j + sz] || dp2[0][node][j] + dp[1][vecin][sz] + edcost < dp2[1][node][j + sz]) {
                    dp2[1][node][j + sz] = dp2[0][node][j] + dp[1][vecin][sz] + edcost;
                    viz2[1][node][j + sz] = 1;
                    xtr2[1][node][j + sz] = xtr[vecin][sz];
                } 
                else {
                    if (dp2[0][node][j] + dp[1][vecin][sz] + edcost == dp2[1][node][j + sz]) {
                        xtr2[1][node][j + sz] = min(xtr2[1][node][j + sz], xtr[vecin][sz]);
                    }
                }
                for (int trb = 0; trb <= 1; ++trb) {
                    if (!viz2[trb][node][j + sz] ||
                        dp2[trb][node][j] + dp[0][vecin][sz] + 2 * edcost < dp2[trb][node][j + sz]) {
                        dp2[trb][node][j + sz] = dp2[trb][node][j] + dp[0][vecin][sz] + 2 * edcost;
                        viz2[trb][node][j + sz] = 1;
                        xtr2[trb][node][j + sz] = xtr2[trb][node][j];
                    } 
                    else if (dp2[trb][node][j] + dp[0][vecin][sz] + 2 * edcost == dp2[trb][node][j + sz]) {
                        xtr2[trb][node][j + sz] = min(xtr2[trb][node][j + sz], xtr2[trb][node][j]);
                    }
                }
            }
        sts[node] += sts[vecin];
    }
    for (int i = 2; i <= min(k, sts[node]); ++i) {
        dp[1][node][i] = dp2[1][node][i];
        xtr[node][i] = xtr2[1][node][i];
        dp[0][node][i] = dp2[0][node][i];
    }
    for (int i = 1; i <= min(k, sts[node]); ++i)
        xtr[node][i] += cost;
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    cin >> n >> k >> x;
    for (int i = 1; i < n; ++i) {
        int a, b, c;
        cin >> a >> b >> c;
        v[a].push_back({b, c});
        v[b].push_back({a, c});
    }
    dfs(0, x, 0);
    cout << dp[1][x][k] << '\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...