#include <bits/stdc++.h>
using namespace std;
struct edge {
int u, v, c;
int other(int w) {
return u ^ v ^ w;
}
};
struct infopq {
int v;
long long d;
bool operator<(const infopq &x) const {
return d > x.d;
}
};
const int MAX_N = 1e5;
const int MAX_M = 2e5;
const int MAX_K = 5;
const long long INF = 1e18;
int n;
edge edges[MAX_M];
vector<int> adj[MAX_N + 1];
int cities[MAX_K];
long long dist[(1 << (MAX_K - 1))][MAX_N + 1];
bool vis[MAX_N + 1];
void dijkstra(long long dist[]) {
priority_queue<infopq> pq;
for (int v = 1; v <= n; v++) {
vis[v] = false;
pq.push({v, dist[v]});
}
while (!pq.empty()) {
auto u = pq.top().v;
pq.pop();
if (vis[u])
continue;
vis[u] = true;
for (int e: adj[u]) {
int v = edges[e].other(u), c = edges[e].c;
if (dist[u] + c < dist[v]) {
dist[v] = dist[u] + c;
pq.push({v, dist[v]});
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int k, m;
cin >> n >> k >> m;
for (int i = 0; i < k; i++)
cin >> cities[i];
for (int e = 0; e < m; e++) {
cin >> edges[e].u >> edges[e].v >> edges[e].c;
adj[edges[e].u].push_back(e);
adj[edges[e].v].push_back(e);
}
for (int mask = 1; mask < (1 << (k - 1)); mask++) {
for (int v = 1; v <= n; v++)
dist[mask][v] = INF;
}
for (int i = 0; i < k - 1; i++)
dist[(1 << i)][cities[i]] = 0;
for (int mask = 1; mask < (1 << (k - 1)); mask++) {
dijkstra(dist[mask]);
for (int mask2 = 1; mask2 < mask; mask2++) {
for (int v = 1; v <= n; v++)
dist[mask | mask2][v] = min(dist[mask | mask2][v], dist[mask][v] + dist[mask2][v]);
}
/* printf("MASK %d\n", mask); */
/* for (int v = 1; v <= n; v++) */
/* printf("%lld ", dist[mask][v]); */
/* printf("\n"); */
}
cout << dist[(1 << (k - 1)) - 1][cities[k - 1]] << "\n";
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... |