제출 #1359617

#제출 시각아이디문제언어결과실행 시간메모리
1359617minhtienMuseum (CEOI17_museum)C++20
100 / 100
289 ms307936 KiB
#include <bits/stdc++.h>
#define ll long long
#define ii pair<ll,ll>
#define fi first
#define se second
using namespace std;
const int N=1e4+5;
const ll maxn=1e18;
vector<ll>dp[N][2];
vector<ii>v[N];
int sz[N];
int n,k,x;
void dfs(int s,int pr){
    sz[s]=1;
    dp[s][0].assign(2,maxn);
    dp[s][1].assign(2,maxn);
    dp[s][0][1]=0;
    dp[s][1][1]=0;
    for(auto x:v[s]){
        int node=x.fi;
        ll w=x.se;
        if(node!=pr){
            dfs(node,s);
            int n1=min(k,sz[s]+sz[node]);
            vector<ll>dp1[s+1][2];
            dp1[s][0].assign(n1+1,maxn);
            dp1[s][1].assign(n1+1,maxn);
            for(int i=1;i<=min(sz[s],k);i++){
                for(int j=1;j<=min(sz[node],k);j++){
                    dp1[s][0][i]=min(dp1[s][0][i],dp[s][0][i]);
                    dp1[s][1][i]=min(dp1[s][1][i],dp[s][1][i]);
                    if(i+j<=k){
                        dp1[s][0][i+j]=min(dp1[s][0][i+j],dp[s][1][i]+dp[node][0][j]+w);
                        dp1[s][0][i+j]=min(dp1[s][0][i+j],dp[s][0][i]+dp[node][1][j]+2*w);
                        dp1[s][1][i+j]=min(dp1[s][1][i+j],dp[s][1][i]+dp[node][1][j]+2*w);
                    }
                }
            }
            dp[s][0]=dp1[s][0];
            dp[s][1]=dp1[s][1];
//            dp[node][0].clear();
//            dp[node][1].clear();
            sz[s]+=sz[node];
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    cin >>n >>k >>x;
    for(int i=1;i<=n-1;i++){
        ll x1,y1,w1;
        cin >>x1 >>y1 >>w1;
        v[x1].push_back({y1,w1});
        v[y1].push_back({x1,w1});
    }
    dfs(x,-1);
    cout << dp[x][0][k];
    return 0;
}


/*

11 8 3
1 3 3
3 2 5
6 4 5
1 11 3
9 1 2
9 10 2
3 7 10
6 7 1
7 8 1
7 5 1



*/
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…