제출 #1294389

#제출 시각아이디문제언어결과실행 시간메모리
1294389trantrungkeinCities (BOI16_cities)C++20
100 / 100
1305 ms42216 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 1e16;
const int N = 2e5 + 7;
int n,m,k,par[N],dist[N],vis[N],span = 0,root,spec[N];
vector<pair<int,int>> g[N];
int dp[(1<<5)+1][100005];

int32_t main(){
    cin >> n >> k >> m;
    for(int i = 0; i < k; i++){
        cin >> spec[i]; spec[i]--;
    }
    for(int i = 1; i <= m; i++){
        int u,v,w;
        cin >> u >> v >> w;
        u--; v--;
        g[u].push_back({v,w});
        g[v].push_back({u,w});
    }
    int len = (1<<k);
    for(int mask = 0; mask < len; mask++){
        for(int i = 0; i < n; i++){
            dp[mask][i] = INF;
        }
    }
    for(int i = 0; i < k; i++) dp[(1<<i)][spec[i]] = 0;
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
    for(int mask = 1; mask < len; mask++){
        if((mask&(mask-1))!=0){
            for(int i = 0; i < n; i++){
                for(int sub = (mask-1)&mask; sub>0; sub = (sub-1)&mask){
                    if(dp[sub][i] != INF && dp[mask^sub][i] != INF){
                        dp[mask][i] = min(dp[mask][i],dp[sub][i]+dp[mask^sub][i]);
                    }
                }
            }
        }
        for(int i = 0; i < n; i++) if(dp[mask][i] != INF) q.push({dp[mask][i],i});
        while(!q.empty()){
            auto [W,u] = q.top(); q.pop();
            if(W > dp[mask][u]) continue;
            for(auto [v,w] : g[u]){
                if(dp[mask][v] > dp[mask][u] + w){
                    dp[mask][v] = dp[mask][u] + w;
                    q.push({dp[mask][v],v});
                }
            }
        }
    }
    int ans = INF;
    for(int i = 0; i < n; i++) ans = min(ans,dp[(1<<k)-1][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...