#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
const long long inf = 1e15;
int n, k, m;
int important[5];
vector <pair <int, int>> adj[maxn];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> k >> m;
for(int i = 0; i < k; ++i) cin >> important[i];
for(int a, b, c; m--;) {
cin >> a >> b >> c;
adj[a].emplace_back(b, c);
adj[b].emplace_back(a, c);
}
if(k == 2) {
vector <long long> d(n + 1, inf);
priority_queue <pair <long long, int>, vector <pair <long long, int>>, greater <pair <long long, int>>> q;
int &s = important[0];
int &t = important[1];
q.emplace(d[s] = 0, s);
while(!q.empty()) {
auto[c, v] = q.top(); q.pop();
if(c > d[v]) continue;
for(auto &[x, w]: adj[v]) {
if(d[x] <= c + w) continue;
q.emplace(d[x] = c + w, x);
}
}
cout << d[t];
return 0;
}
k -= 2;
vector <vector <long long>> dis0(n + 1, vector <long long> (1 << k, inf));
vector <vector <long long>> dis1(n + 1, vector <long long> (1 << k, inf));
priority_queue <tuple <long long, int, int>, vector <tuple <long long, int, int>>, greater <tuple <long long, int, int>>> q;
for(int i = 0; i < k; ++i)
q.emplace(dis0[important[i]][1 << i] = 0, 1 << i, important[i]);
while(!q.empty()) {
auto [d, s, v] = q.top(); q.pop();
if(d > dis0[v][s]) continue;
for(auto &[x, w]: adj[v]) if(dis0[x][s] > d + w) {
q.emplace(dis0[x][s] = d + w, s, x);
}
for(int mask = (1 << k) - 1 - s; mask; mask &= --mask){
if(dis0[v][s | mask] <= d + dis0[v][mask]) continue;
q.emplace(dis0[v][s | mask] = d + dis0[v][mask], s | mask, v);
}
}
q.emplace(dis1[important[k]][0] = 0, 0, important[k]);
while(!q.empty()) {
auto [d, s, v] = q.top(); q.pop();
if(d > dis1[v][s]) continue;
for(auto &[x, w]: adj[v]) if(dis1[x][s] > d + w) {
q.emplace(dis1[x][s] = d + w, s, x);
}
for(int mask = (1 << k) - 1 - s; mask; mask &= --mask){
if(dis1[v][s | mask] <= d + dis0[v][mask]) continue;
q.emplace(dis1[v][s | mask] = d + dis0[v][mask], s | mask, v);
}
}
cout << dis1[important[k + 1]][(1 << k) - 1];
}
| # | 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... |