Submission #1352751

#TimeUsernameProblemLanguageResultExecution timeMemory
1352751minhanhphan555Museum (CEOI17_museum)C++20
80 / 100
3095 ms72848 KiB
#include <bits/stdc++.h>
using namespace std ;

#define endl '\n'
#define pb push_back
#define REP(i , n) for(int i = 0 , _n = (n) ; i < _n ; ++i)

#define MAXN 10005

const long long INF = 1e18 ;
vector <pair <int , int>> adj[MAXN + 1] ;
int numNode , k , startNode , sub[MAXN + 1] ;

long long f[MAXN + 1][MAXN + 1][2] ;

// f(i , numNodeVisited , 0/1)

void dfs(int u , int par) {
    sub[u] = 1 ;
    for(pair <int , int> it : adj[u]) if(it.first != par) dfs(it.first , u) , sub[u] += sub[it.first] ;

    vector <vector <long long>> prev(min(k , sub[u]) + 1 , vector <long long> (2 , INF)) ;

    REP(numVis , min(k , sub[u]) + 1) REP(up , 2) f[u][numVis][up] = INF ;
    f[u][1][0] = 0 ;
    f[u][1][1] = 0 ;
    prev[1][0] = 0 ;
    prev[1][1] = 0 ;

    int cur = 1 ;
    for(pair <int , int> it : adj[u]) {
        int v = it.first , w = it.second ;
        if(v == par) continue ;

        cur += sub[v] ;

//        cout << "BEFORE MERGE " << v << " TO " << u << endl ;
//        REP(numVis , min(k , cur + 1)) REP(up , 2) {
//            cout << "prev[" << numVis << "]" << "[" << up << "]" << " = " << prev[numVis][up] << endl ;
//        }

        REP(numVis , min(k , cur) + 1) REP(up , 2) REP(numJoin , min(k , sub[v]) + 1) REP(vp , 2) {
            if(numVis + numJoin > min(k , cur)) break ;
            if(up & vp) continue ;

            f[u][numVis + numJoin][up | vp] = min(f[u][numVis + numJoin][up | vp] , prev[numVis][up] + f[v][numJoin][vp] + 2 * w - (vp == 1 ? w : 0) ) ;
        }
        REP(numVis , min(k , cur) + 1)  REP(up , 2) prev[numVis][up] = f[u][numVis][up] ;

//        cout << "AFTER MERGE " << v << " TO " << u << endl ;
//        REP(numVis , min(k , cur + 1)) REP(up , 2) {
//            cout << "prev[" << numVis << "]" << "[" << up << "]" << " = " << prev[numVis][up] << endl ;
//        }

    }
}

int main(void) {
    ios_base::sync_with_stdio(false) ;
    cout.tie(nullptr) ;
    cin.tie(nullptr) ;

    cin >> numNode >> k >> startNode ;
    REP(faker , numNode - 1) {
        int u , v , w ; cin >> u >> v >> w ;
        adj[u].pb({v , w}) ; adj[v].pb({u , w}) ;
    }

    dfs(startNode , 0) ;
    cout << f[startNode][k][1] << endl ;
    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...