#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;
// using T = tuple <long long, int, int>;
// T a = {0, 1, 2}, b = {2, 1, 0};
// cout << (a < b) << '\n';
// for(int i = 0; i < k + 2; ++i) cout << important[i] << ' ';
// cout << '\n';
for(int i = 0; i < k; ++i){
// cout << i << ' ' << important[i] << '\n';
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);
}
}
// for(int i = 1; i <= n; ++i)
// cout << "dis0 " << i << ' ' << dis0[i][1] << '\n';
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;
// cout << d << ' ' << s << ' ' << v << '\n';
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;
// if(d == 0 && s == 0 && v == 3) cout << "mask " << mask << ' ' << d << ' ' << dis0[v][mask] << '\n';
q.emplace(dis1[v][s | mask] = d + dis0[v][mask], s | mask, v);
}
}
// cout << important[k + 1] << '\n';
cout << dis1[important[k + 1]][(1 << k) - 1];
cerr << "ok\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... |