제출 #1317905

#제출 시각아이디문제언어결과실행 시간메모리
1317905nghiaxtoneriCities (BOI16_cities)C++20
100 / 100
1392 ms44792 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5 + 5;
const int M = 1 << 5 + 5;
vector<pair<int,int>> g[2*N];
int dp[M][N],a[10];
bool used[N];
int n,k,m;


int32_t main(){
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>k>>m;
    int big = 1 << k;
    for(int i = 0;i<big;i++) for(int j = 1;j<=n;j++) dp[i][j] = 1e18;
    for(int i = 0;i<k;i++){
        cin>>a[i];
        dp[1 << i][a[i]] = 0;
    }
    for(int i = 0;i<m;i++){
        int u,v,w;cin>>u>>v>>w;
        g[u].push_back({v,w});
        g[v].push_back({u,w});
    }
    for(int mask = 0;mask < big;mask++){
        for(int sub = mask;sub > 0;sub = (sub - 1)&mask){
            int l = sub;
            int r = mask^sub;
            if(l > r) continue;
            for(int i = 1;i<=n;i++) dp[mask][i] = min(dp[mask][i],dp[l][i] + dp[r][i]);
        }

        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
        for(int i = 1;i<=n;i++){
            q.push({dp[mask][i],i});
            used[i] = false;
        }
        while(!q.empty()){
            int u = q.top().second;q.pop();
            if(used[u]) continue;
            used[u] = true;
            for(auto it : g[u]){
                int v = it.first;
                int w = it.second;
                if(dp[mask][v] > dp[mask][u] + w){
                    dp[mask][v] = dp[mask][u] + w;
                    q.push({dp[mask][v],v});
                }
            }
        }

    }
    int res = 1e18;
    for(int j = 1;j<=n;j++) res = min(res,dp[big - 1][j]);
    cout<<res;
    return 0;
}
#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...