제출 #1124830

#제출 시각아이디문제언어결과실행 시간메모리
1124830doducanhMuseum (CEOI17_museum)C++20
100 / 100
762 ms784752 KiB
///roadtoVOI2025
///enjoythejourney
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define ii pair<int,int>
#define mp make_pair
#define in(x) freopen(x,"r",stdin)
#define out(x) freopen(x,"w",stdout)
#define bit(x,i) ((x>>i)&1)
#define lc (id<<1)
#define rc ((id<<1)^1)
const int maxn=1e4+7;
const int inf=1e9+7;
vector<ii>adj[maxn];
int dp[maxn][2][maxn];
int ndp[2][maxn];
int sz[maxn];
int n,k,x;
void work(int u,int v,int w)
{
    for(int i=sz[u];i>=0;i--){
        for(int j=sz[v];j>=1;j--){
            ndp[0][i+j]=min(ndp[0][i+j],dp[u][0][i]+dp[v][0][j]+2*w);
            ndp[1][i+j]=min(ndp[1][i+j],dp[u][1][i]+dp[v][0][j]+2*w);
            ndp[1][i+j]=min(ndp[1][i+j],dp[u][0][i]+dp[v][1][j]+w);
        }
    }
    sz[u]+=sz[v];
    for(int i=sz[u];i>=0;i--){
        dp[u][0][i]=min(dp[u][0][i],ndp[0][i]);
        dp[u][1][i]=min(dp[u][1][i],ndp[1][i]);
        ndp[0][i]=inf;
        ndp[1][i]=inf;
    }
}
void dfs(int u,int par)
{
    sz[u]=1;
    dp[u][0][1]=0;
    dp[u][1][1]=0;
    for(ii pp:adj[u]){
        int v=pp.fi;
        int w=pp.se;
        if(v==par)continue;
        dfs(v,u);
        work(u,v,w);
    }
}
void sol()
{
    cin>>n>>k>>x;
    ndp[0][0]=inf;
    ndp[1][0]=inf;
    for(int i=1;i<=n;i++){
        ndp[0][i]=inf;
        ndp[1][i]=inf;
        for(int j=0;j<=n;j++){
            dp[i][0][j]=inf;
            dp[i][1][j]=inf;
        }
    }
    for(int i=1;i<n;i++){
        int u,v,w;
        cin>>u>>v>>w;
        adj[u].push_back({v,w});
        adj[v].push_back({u,w});
    }
    dfs(x,0);
    cout<<min(dp[x][1][k],dp[x][0][k])<<"\n";
}
signed main(void)
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t=1;
    while(t--){
        sol();
    }
    // you should actually read the stuff at the bottom
    return 0;
}
/* stuff you should look for
 * int overflow, array bounds
 * special cases (n=1?)
 * do smth instead of nothing and stay organized
 * WRITE STUFF DOWN
 * DON'T GET STUCK ON ONE APPROACH
 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...