Submission #1176820

#TimeUsernameProblemLanguageResultExecution timeMemory
1176820ezzzayMuseum (CEOI17_museum)C++20
20 / 100
470 ms164580 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pb push_back
const int N=35;
int dst[N][N];
vector<pair<int,int>>v[N];
void dfs(int a, int p, int g){
    for(auto [b,c]:v[a]){
        if(b==p)continue;
        dst[g][b]=dst[g][a]+c;
        dfs(b,a,g);
    }
}
int dp[(1<<20)][20];
signed main(){
    int n,k,x;
    cin>>n>>k>>x;
    x--;
    for(int i=0;i<n-1;i++){
        int a,b,c;
        cin>>a>>b>>c;
        a--;
        b--;
        v[a].pb({b,c});
        v[b].pb({a,c});
    }
    for(int i=0;i<n;i++){
        dfs(i,-1,i);
    }
    for(int i=0;i<(1<<n);i++){
        for(int j=0;j<n;j++){
            dp[i][j]=1e14;
        }
    }
    dp[(1<<x)][x]=0;
    int ans=1e14;
    for(int i=0;i<(1<<n);i++){
        vector<int>A,B;
        int g=0;
        for(int j=0;j<n;j++){
            if(i & (1<<j)){
                A.pb(j);
                g++;
            }
            else{
                B.pb(j);
            }
        }
        if(g==k){
            for(auto a:A){
                ans=min(ans,dp[i][a]);
            }
        }
        for(auto a:A){
            for(auto b:B){
                dp[i+(1<<b)][b]= min(dp[i+(1<<b)][b] , dp[i][a]+dst[a][b]);
            }
        }
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...