Submission #1125415

#TimeUsernameProblemLanguageResultExecution timeMemory
1125415ardadutMuseum (CEOI17_museum)C++20
100 / 100
512 ms402304 KiB
#include <bits/stdc++.h>
    
#define ll long long
#define pb push_back
#define endl "\n"
#define vec vector<ll>
#define vecvec vector<vector<ll>>
    
using namespace std;
    
/*#define FileName ""
string Ghhhh = ".in";
string Ghhhhh = ".out";
ifstream Girdi(FileName + Ghhhh);
ofstream Cikti(FileName + Ghhhhh);
#define cin Girdi
#define cout Cikti*/

const ll INF = 1e15;
ll n,k,x;
vector<vector<pair<ll,ll>>> adj;
vector<vector<vector<ll>>> dp;
map<pair<ll,ll>,ll> mapp;

inline vector<ll> comp(vector<ll> vec1, vector<ll> vec2){
    vector<ll> ans(vec1.size());
    for(ll i = 0 ; i < vec1.size() ; i++){
        ans[i] = min(vec1[i],vec2[i]);
    }
    return ans;
}

inline vector<ll> total_min(vector<ll> a, vector<ll> b, ll cost,bool type){
    vector<ll> combined(a.size() + b.size() - 1, INF);
    combined[0] = 0;
    for(ll i = 1 ; i < a.size() ; i++){
        for(ll j = 0 ; j < b.size() ; j++){
            if(j == 0){
                combined[i+j] = min(combined[i+j],a[i]);
            }else{
                combined[i+j] = min(combined[i+j], a[i] + b[j] + (type ? cost * 2 : cost));
            }
            
        }
    }
    return combined;
}

inline void process(ll room, ll prev_room){

    dp[room][0] = {0,0};
    dp[room][1] = {0,0};

    for(auto go : adj[room]){
        if(prev_room == go.first) continue;
        process(go.first,room);
        vector<ll> vec1 = total_min(dp[room][1],dp[go.first][0],go.second,0);
        vector<ll> vec2 = total_min(dp[room][0],dp[go.first][1],go.second,1);
        dp[room][0] = comp(vec1,vec2);
        dp[room][1] = total_min(dp[room][1],dp[go.first][1],go.second,1);
    }

}

inline void solve(){

    cin >> n >> k >> x;
    adj.resize(n+1);
    dp.resize(n+1,vector<vector<ll>>(2));

    for(ll i = 1 ; i < n ; i++){
        ll a,b,w;
        cin >> a >> b >> w;
        adj[a].pb({b,w});
        adj[b].pb({a,w});
    }

    process(x,-1);

    cout << dp[x][0][k] << endl;

}
    
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    ll t = 1;
    //cin >> t;
    while(t--){
        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...