#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 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... |