제출 #1178375

#제출 시각아이디문제언어결과실행 시간메모리
1178375ezzzayCities (BOI16_cities)C++20
0 / 100
105 ms65632 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;
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()){
            auto [w,a]=q.top();
            q.pop();
            if(dp[msk][a]>w)continue;
            for(auto [b,c]:v[a]){
                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...