#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |