제출 #1359663

#제출 시각아이디문제언어결과실행 시간메모리
1359663goulthenMuseum (CEOI17_museum)C++20
100 / 100
160 ms169808 KiB
#include <bits/stdc++.h>
using namespace std;

//#define int long long
#define rep(i,a,b) for (int i = a; i <= b; i++)
#define per(i,a,b) for (int i = a; i >= b; i--)
#define pii pair<int,int>
#define fi first
#define se second
#define endl '\n'
#define pb push_back
#define all(v) (v).begin(), (v).end()

const int MAXN = 1e4+10;
const int INF = 1e9+10;
const int MOD = 1e9+7;
int dp[MAXN][MAXN][2], sz[MAXN],n;
vector<pii> g[MAXN];

void dfs(int u, int p = -1) {
    sz[u] = 1;
    for(auto &[v,w] : g[u]) if(v!=p) {
        dfs(v,u);
        sz[u] += sz[v];
    }
    int cur = 1;

    rep(j,2,sz[u]) dp[u][j][0] = dp[u][j][1] = INF;
    for(auto &[v,w] : g[u]) if(v!=p) {
        rep(x,0,cur+sz[v]) dp[n+1][x][0] = dp[u][x][0], dp[n+1][x][1] = dp[u][x][1];

        rep(x,1,cur) {
            rep(y,1,sz[v]) {
                dp[n+1][x+y][0] = min(dp[n+1][x+y][0], dp[u][x][0]+dp[v][y][0]+2*w);
                dp[n+1][x+y][1] = min(dp[n+1][x+y][1], dp[u][x][1]+dp[v][y][0]+2*w);
                dp[n+1][x+y][1] = min(dp[n+1][x+y][1], dp[u][x][0]+dp[v][y][1]+w);
            }
        }

        cur += sz[v];
        rep(x,0,cur) dp[u][x][0] = dp[n+1][x][0], dp[u][x][1] = dp[n+1][x][1];
    }
}

void solve() {
    int k,x; cin >> n >> k >> x;
    rep(i,1,n-1) {
        int u,v,w;cin >> u >> v >> w;
        g[u].pb({v,w});
        g[v].pb({u,w});
    }

    dfs(x);

    cout << dp[x][k][1] << endl;
}

int32_t main() {
    ios_base::sync_with_stdio(0);cin.tie(nullptr);
	int tt = 1;
    //cin >> tt;
    
    while(tt--) solve();
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…