제출 #1155926

#제출 시각아이디문제언어결과실행 시간메모리
1155926VMaksimoski008Museum (CEOI17_museum)C++20
100 / 100
213 ms220796 KiB
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 5;

int dp[2][maxn][maxn], dep[maxn], tmp[2][maxn];
vector<pair<int, int> > G[maxn];
int n, k, r, sub[maxn];

void dfs(int u, int p) {
    sub[u] = 1;

    for(auto [v, w] : G[u]) {
        if(v == p) continue;
        dep[v] = dep[u] + w;
        dfs(v, u);
        sub[u] += sub[v];
    }

    for(int i=0; i<=sub[u]; i++)
        dp[0][u][i] = dp[1][u][i] = 1e9;
    dp[0][u][0] = 0;
    dp[0][u][1] = 0;
    dp[1][u][1] = -dep[u];

    sub[u] = 1;
    for(auto [v, w] : G[u]) {
        if(v == p) continue;
        
        int t = sub[u] + sub[v];
        for(int i=min(t, k); i>=2; i--) {
            for(int j=min(sub[v], i-1); j>=max(1, i-sub[u]); j--) {
                dp[0][u][i] = min(dp[0][u][i], dp[0][v][j] + dp[0][u][i-j] + 2 * w);
                dp[1][u][i] = min(dp[1][u][i], dp[1][u][i-j] + dp[0][v][j] + 2 * w);
                dp[1][u][i] = min(dp[1][u][i], dp[0][u][i-j] + dp[1][v][j] + 2 * w);
            }
        }

        sub[u] += sub[v];
    }
}

signed main() {
    cin >> n >> k >> r;
    for(int i=1; i<n; i++) {
        int a, b, w; cin >> a >> b >> w;
        G[a].push_back({ b, w });
        G[b].push_back({ a, w });
    }

    dfs(r, r);
    cout << dp[1][r][k] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...