#include <iostream>
#include <set>
#include <vector>
using namespace std;
#define int long long
const int N = 1<<17;
vector<pair<int,int>> nei[N];
int Mn[32][N], sp[5], n, m, k, Ans = 1e9;
void dijkstra(int s, int str){
set<pair<int,int>> st;
if (s != -1){
Mn[str][s] = 0;
st.insert({0, s});
}
else{
for (int i=1;i<=n;i++)
st.insert({Mn[str][i], i});
}
while (st.size() > 0){
auto [mn, u] = *begin(st);
st.erase(begin(st));
for (auto [i, w] : nei[u]){
if (Mn[str][i] > mn + w){
st.erase({Mn[str][i], i});
Mn[str][i] = mn + w;
st.insert({Mn[str][i], i});
}
}
}
}
signed main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin>>n>>k>>m;
for (int i=0;i<k;i++)
cin>>sp[i];
for (int i=1;i<=m;i++){
int a, b, c;
cin>>a>>b>>c;
nei[a].push_back({b, c});
nei[b].push_back({a, c});
}
for (int i=0;i<=n;i++){
for (int j=1;j<32;j++)
Mn[j][i] = 1e9;
}
for (int i=1, id = 0;i<(1<<k);i++){
if (__builtin_popcount(i) == 1){
dijkstra(sp[id++], i);
continue;
}
for (int u=1;u<=n;u++){
for (auto [v, w] : nei[u])
for (int msk = i; msk; msk = (msk - 1) & i)
Mn[i][u] = min(Mn[i][u], Mn[msk][v] + w + Mn[i ^ msk][u]);
}
dijkstra(-1, i);
}
for (int i=1;i<=n;i++)
Ans = min(Ans, Mn[(1<<k) - 1][i]);
cout<<Ans<<'\n';
}
| # | 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... |