Submission #1178374

#TimeUsernameProblemLanguageResultExecution timeMemory
1178374ezzzayCities (BOI16_cities)C++20
100 / 100
1189 ms71968 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=2e5+5;
vector<pair<int,int>>v[N];
int dp[33][N];
int n,m,k;
void find(int x, int P){
    for(int i=1;i<=n;i++){
        dp[P][i]=1e15;
    }
    dp[P][x]=0;
    
}
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>k>>m;
    vector<int>vc;
    for(int i=1;i<=k;i++){
        int a;
        cin>>a;
        vc.pb(a);
    }
    for(int i=1;i<=m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        v[a].pb({b,c});
        v[b].pb({a,c});
    }
    for(int i=0;i<N;i++){
        for(int j=0;j<(1<<k);j++){
            dp[j][i]=1e15;
        }
    }
    for(int i=0;i<k;i++){
        dp[1<<i][vc[i]]=0;
    }
    for(int msk=0;msk<(1<<k);msk++){
        for(int x=0;x<msk;x++){
            if((msk|x)!=msk)continue;
            int y=msk ^x;
            for(int i=1;i<=n;i++){
                dp[msk][i]=min(dp[msk][i],dp[x][i]+dp[y][i]);
            }
        }
        priority_queue<pair<int,int>>q;
        for(int i=1;i<=n;i++){
            if(dp[msk][i]<1e15){
                q.push({-dp[msk][i],i});
            }
        }
        while(!q.empty()){
            int w=-q.top().ff;
            int a=q.top().ss;
            q.pop();
            if(dp[msk][a]<w)continue;
            for(auto p:v[a]){
                int b=p.ff;
                int c=p.ss;
                if(dp[msk][b]>dp[msk][a]+c){
                    dp[msk][b]=dp[msk][a]+c;
                    q.push({-dp[msk][b],b});
                }
            }
        }
    }
    int ans=1e15;
    for(int i=0;i<k;i++){
        ans=min(ans,dp[(1<<k)-1][vc[i]]);
    }
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...