Pagini recente » Cod sursa (job #2109180) | Cod sursa (job #2356186) | Cod sursa (job #1846322) | Cod sursa (job #2260202) | Cod sursa (job #2713862)
#include <bits/stdc++.h>
#define Nmax 2002
#define INF 1e9
#define Bit (1 << 15) + 2
#define Kmax 17
#define pi pair<int, int>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int N, M, K;
int dp[Bit][Kmax], dist[Nmax][Nmax], v[Kmax];
bool vis[Nmax];
vector<pi> G[Nmax];
priority_queue<pi, vector<pi>, greater<pi> > Q;
void Dijsktra(int x) {
for (int i = 1; i <= N; ++i)
vis[i] = 0, dist[x][i] = INF;
dist[x][x] = 0;
Q.push({0, x});
while (!Q.empty()) {
int node = Q.top().second, len = Q.top().first;
Q.pop();
if (vis[node]) continue;
vis[node] = 1;
for (auto it: G[node]) {
int nxt = it.first, len2 = len + it.second;
if (!vis[nxt] && len2 < dist[x][nxt])
dist[x][nxt] = len2, Q.push({len2, nxt});
}
}
}
int main()
{
fin >> N >> M >> K;
for (int i = 0; i < K; ++i)
fin >> v[i];
for (int i = 0; i < (1 << K); ++i)
for (int j = 0; j < K; ++j)
dp[i][j] = INF;
for (int i = 1; i <= M; ++i) {
int x, y, c;
fin >> x >> y >> c;
G[x].push_back({y, c});
G[y].push_back({x, c});
}
Dijsktra(1);
if (K == 0) {
fout << dist[1][N] << " ";
return 0;
}
for (int i = 0; i < K; ++i)
Dijsktra(v[i]);
for (int i = 0; i < K; ++i)
dp[(1 << i)][i] = dist[1][v[i]];
for (int msk = 1; msk <= (1 << K) - 1; ++msk)
for (int i = 0; i < K; ++i)
for (int j = 0; j < K; ++j)
if (i != j && msk & (1 << i) && msk & (1 << j))
dp[msk][i] = min(dp[msk][i], dp[msk - (1 << i)][j] + dist[v[j]][v[i]]);
int ans = INF;
for (int i = 0; i < K; ++i)
ans = min(ans, dp[(1 << K) - 1][i] + dist[v[i]][N]);
fout << ans << '\n';
return 0;
}