Pagini recente » Cod sursa (job #1540521) | Cod sursa (job #36128) | Cod sursa (job #1201370) | Cod sursa (job #2365351) | Cod sursa (job #3215919)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
const int inf = 1e9;
const int mod = 1e9 + 7;
int n, m, k;
vii gf[2001];
bool viz[2001];
int dist[2001][2001];
int dp[(1 << 15)][15];
int loc[15];
void dijkstra(int v) {
for (int i = 1; i <= n; i++)
dist[v][i] = inf, viz[i] = 0;
dist[v][v] = 0;
priority_queue<ii, vii, greater<ii>> pq;
pq.push({ dist[v][v], v });
while (!pq.empty()) {
int vn = pq.top().second;
pq.pop();
if (viz[vn])
continue;
viz[vn] = 1;
for (ii i : gf[vn]) {
int vvc = i.first;
int vvn = i.second;
if (!viz[vvn] && dist[v][vvn] > dist[v][vn] + vvc) {
dist[v][vvn] = dist[v][vn] + vvc;
pq.push({ dist[v][vvn], vvn });
}
}
}
}
int main() {
fin >> n >> m >> k;
for (int i = 0; i < k; i++)
fin >> loc[i];
for (int i = 1; i <= m; i++) {
int x, y, c;
fin >> x >> y >> c;
gf[x].push_back({ c, y });
gf[y].push_back({ c, x });
}
dijkstra(1);
dijkstra(n);
for (int i = 0; i < k; i++)
dijkstra(loc[i]);
if (k == 0) {
fout << dist[1][n];
return 0;
}
for (int i = 0; i < (1 << k); i++)
for (int j = 0; j < k; j++)
dp[i][j] = inf;
for (int j = 0; j < k; j++)
dp[(1 << j)][j] = dist[1][loc[j]];
for (int i = 1; i < (1 << k); i++)
for (int j = 0; j < k; j++)
if (((1 << j) & i) != 0) {
int alt = (i ^ (1 << j));
for (int a = 0; a < k; a++)
dp[i][j] = min(dp[i][j], dp[alt][a] + dist[loc[a]][loc[j]]);
}
int ans = inf;
for (int j = 0; j < k; j++)
ans = min(ans, dp[(1 << k) - 1][j] + dist[loc[j]][n]);
fout << ans;
return 0;
}