Pagini recente » Cod sursa (job #2367908) | Cod sursa (job #2541628) | Cod sursa (job #2918442) | Cod sursa (job #2726931) | Cod sursa (job #2840846)
#include <bits/stdc++.h>
using namespace std;
const int N = 2000, K = 15;
int d[N + 5][N + 5];
vector <pair <int, int>> g[N + 5];
void dijkstra(int s, int n) {
priority_queue <pair <int, int>> pq;
fill(d[s] + 1, d[s] + n + 1, 2e9);
for(pq.emplace(0, s), d[s][s] = 0; !pq.empty(); pq.pop()) {
auto [dist, u] = pq.top();
if(-dist != d[s][u]) continue;
for(auto [v, w] : g[u]) if(d[s][v] > w - dist) {
d[s][v] = w - dist;
pq.emplace(dist - w, v);
}
}
}
long long dp[1 << K][K];
int main()
{
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
int n, m, k;
cin >> n >> m >> k;
vector <int> stops(k);
for(int i = 0; i < k; i++)
cin >> stops[i];
for(int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
g[u].emplace_back(v, w);
g[v].emplace_back(u, w);
}
dijkstra(1, n);
for(int stop : stops)
dijkstra(stop, n);
for(int i = 0; i < k; i++)
dp[1 << i][i] = d[1][stops[i]];
int kk = 1 << k;
for(int mask = 1; mask < kk; mask++) {
for(int cm = mask; cm; cm &= cm - 1) {
int u = 31 - __builtin_clz(cm & (-cm));
for(int v = 0; v < k; v++) if(!(mask & (1 << v))) {
int mv = mask ^ (1 << v);
dp[mv][v] = dp[mask][u] + d[stops[u]][stops[v]];
}
}
}
long long res = 1e18;
for(int i = 0; i < k; i++)
res = min(res, dp[kk - 1][i] + d[stops[i]][n]);
cout << res;
return 0;
}