Pagini recente » Cod sursa (job #686355) | Cod sursa (job #1097458) | Cod sursa (job #294145) | Cod sursa (job #73932) | Cod sursa (job #2685238)
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define pi pair<int,int>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int N, M, K;
vector<int> c, D;
vector<vector<pi>> G;
vector<vector<int>> d, dp;
void Dijkstra(int start, vector<int> &dist) {
priority_queue<pi> Q;
Q.emplace(0, start);
dist.assign(N + 1, INF);
dist[start] = 0;
while(!Q.empty()) {
int node = Q.top().second;
Q.pop();
for(pi next : G[node])
if(dist[next.first] > dist[node] + next.second) {
dist[next.first] = dist[node] + next.second;
Q.emplace(-dist[next.first], next.first);
}
}
}
void min_self(int &a, int b) {
a = min(a, b);
}
int main() {
fin >> N >> M >> K;
c.resize(K);
for(int &x : c)
fin >> x;
G.resize(N + 1);
while(M--) {
int u, v, w;
fin >> u >> v >> w;
G[u].emplace_back(v, w);
G[v].emplace_back(u, w);
}
Dijkstra(1, D);
if(K == 0) {
fout << D[N];
return 0;
}
d.resize(K);
for(int i = 0; i < K; ++i)
Dijkstra(c[i], d[i]);
dp.assign(1 << K, vector<int>(K, INF));
for(int i = 0; i < K; ++i)
dp[1 << i][i] = D[c[i]];
for(int mask = 1; mask < (1 << K); ++mask)
for(int i = 0; i < K; ++i)
if(mask & (1 << i))
for(int j = 0; j < K; ++j)
if(j != i && (mask & (1 << j)))
min_self(dp[mask][i], dp[mask ^ (1 << i)][j] + d[i][c[j]]);
int ans = INF;
for(int i = 0; i < K; ++i)
min_self(ans, dp[(1 << K) - 1][i] + d[i][N]);
fout << ans;
}