Submission #1276728

#TimeUsernameProblemLanguageResultExecution timeMemory
1276728herominhsteveMuseum (CEOI17_museum)C++20
100 / 100
444 ms784872 KiB
#include <bits/stdc++.h>
using namespace std;
#define FAST_IO ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;

#define el "\n"
#define gcd __gcd
#define lcm(a, b) a / gcd(a,b) * b
#define get_bit(mask, i) ((mask >> i) & 1)
#define set_bit(mask, i) (mask | (1<<(i)))
#define low_bit(mask) (mask & (-mask))
#define pb push_back
#define emp emplace
#define emb emplace_back
#define emf emplace_front
#define mpair make_pair
#define fi first
#define se second
#define rounds(n) setprecision(n) << fixed

const int INF = 0x3f3f3f3f;
const ll LLINF = (ll)1e18+3;
const int MAXSIZE = (int)1e4+7;
const int MOD = (int)1e9+7;
const string NAME = "test";


template <class T> inline bool minimize(T &x, T y){ if (x > y){x = y; return true;} return false; }
template <class T> inline bool maximize(T &x, T y){ if (x < y){x = y; return true;} return false; }

int N, K, X;
vector<pii> adj[MAXSIZE];

void INPUT()
{
    cin >> N >> K >> X;
    for (int i = 2; i <= N; ++i){
        int u, v, c; 
        cin >> u >> v >> c;
        adj[u].pb({v, c});
        adj[v].pb({u, c});
    }
}

int dp[MAXSIZE][MAXSIZE][2];
int cnt[MAXSIZE];

void dfs(int u, int p)
{
    cnt[u] = 1;
    dp[u][1][0] = dp[u][1][1] = 0;

    for (pii e : adj[u]){
        int v = e.fi, c = e.se;
        if (v == p) continue;
        dfs(v, u);
        for (int j = min(K, cnt[u]); j >= 1; --j){
            for (int k = min(K - j, cnt[v]); k >= 1; --k){
                minimize(dp[u][j + k][0], dp[u][j][0] + dp[v][k][0] + 2*c);

                minimize(dp[u][j + k][1], dp[u][j][1] + dp[v][k][0] + 2*c);
                minimize(dp[u][j + k][1], dp[u][j][0] + dp[v][k][1] + c);
            }
        }

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

void SOLVE()
{
    for (int i = 1; i <= N; ++i){
        for (int j = 1; j <= N; ++j){
            dp[i][j][0] = dp[i][j][1] = INF;
        }
    }

    dfs(X, -1);
    cout << min(dp[X][K][0], dp[X][K][1]);
}

int main(){
    FAST_IO;
    INPUT();
    SOLVE();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...