#include <bits/stdc++.h>
#define file(name) if (fopen(name".inp", "r")) { freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout); }
#define ll long long
#define fi first
#define se second
using namespace std;
#define int long long
const int INF = 1e16;
void solve(int tc) {
int n, k, m;
cin >> n >> k >> m;
vector<int> imp(k);
for (auto& i : imp) {
cin >> i, i--;
}
k--;
vector<vector<pair<int, int>>> adj(n);
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
a--, b--;
adj[a].emplace_back(b, c);
adj[b].emplace_back(a, c);
}
vector<vector<int>> dp(1 << k, vector<int>(n, INF));
for (int i = 0; i < k; i++) {
dp[1 << i][imp[i]] = 0;
}
for (int mask = 1; mask < 1 << k; mask++) {
for (int nmask = 1; nmask < mask; nmask++) {
if ((nmask | mask) != mask) continue;
int tmp = nmask ^ mask;
if (tmp < nmask) continue;
for (int i = 0; i < n; i++) {
dp[mask][i] = min(dp[mask][i], dp[nmask][i] + dp[tmp][i]);
}
}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
for (int i = 0; i < n; i++) {
if (dp[mask][i] == INF) continue;
pq.emplace(dp[mask][i], i);
}
vector<int> vis(n);
while (!pq.empty()) {
auto [w, u] = pq.top();
pq.pop();
if (vis[u]) continue;
vis[u] = 1;
for (auto [v, vw] : adj[u]) {
if (dp[mask][v] <= w + vw) continue;
dp[mask][v] = w + vw;
pq.emplace(dp[mask][v], v);
}
}
}
cout << dp[(1 << k) - 1][imp[k]] << '\n';
return;
}
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
// file("A") else file("task");
int tc = 1;
// cin >> tc;
for(int i = 1; i <= tc; ++i) solve(i);
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... |