Pagini recente » Cod sursa (job #373991) | Cod sursa (job #1826752) | Cod sursa (job #1889327) | Cod sursa (job #181261) | Cod sursa (job #3275921)
#include <bits/stdc++.h>
using namespace std;
int n, m, k;
vector<pair<int, int>> v[2001];
int c[17], dp[2001][(1 << 17)];
int g[2001][2001];
bool city[2001];
void dijkstra(int start) {
int cost[2001];
memset(cost, 0x3f, sizeof(cost));
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
q.push({0, start});
cost[start] = 0;
while (!q.empty()) {
int node = q.top().second;
if (node != start && (city[node] || node == 1 || node == n)) {
g[start][node] = cost[node];
}
q.pop();
for (int i = 0; i < v[node].size(); ++i) {
if (cost[node] + v[node][i].second < cost[v[node][i].first]) {
cost[v[node][i].first] = cost[node] + v[node][i].second;
q.push({cost[v[node][i].first], v[node][i].first});
}
}
}
}
int main() {
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
cin >> n >> m >> k;
for (int i = 1; i <= k; ++i) {
cin >> c[i];
city[c[i]] = 1;
}
c[++k] = n;
c[++k] = 1;
for (int i = 1; i <= m; ++i) {
int x, y, z;
cin >> x >> y >> z;
v[x].push_back({y, z});
v[y].push_back({x, z});
}
for (int i = 1; i <= k; ++i) {
dijkstra(c[i]);
}
memset(dp, 0x3f, sizeof(dp));
dp[1][1 << (k - 1)] = 0;
for (int s = (1 << (k - 1)) + 1; s <= (1 << k) - 1; ++s) {
for (int i = 1; i <= k; ++i) {
if (s & (1 << (i - 1))) {
for (int l = 1; l <= k; ++l) {
if (l != i && s & (1 << (l - 1))) {
if (g[c[l]][c[i]]) {
dp[c[i]][s] = min(dp[c[i]][s], dp[c[l]][s ^ (1 << (i - 1))] + g[c[l]][c[i]]);
}
}
}
}
}
}
cout << dp[n][(1 << k) - 1];
}