Pagini recente » Cod sursa (job #490322) | Cod sursa (job #2724704) | Cod sursa (job #595999) | Cod sursa (job #629400) | Cod sursa (job #2710510)
#include <fstream>
#include <queue>
#include <vector>
#include <iostream>
using namespace std;
#define pair pair<int, int>
#define Inf 1e9
const int kmax = 17;
int n, m, k;
int C[21];
vector<pair> a[2001];
int dp[2001][2001];
int dmin[2001];
int sol[(1 << kmax)][kmax];
void read() {
int i, x, y, cost;
ifstream f("ubuntzei.in");
f >> n >> m;
f >> k;
for (i = 1; i <= k; i++)
f >> C[i];
for (i = 1; i <= m; i++) {
f >> x >> y >> cost;
a[x].emplace_back(make_pair(cost, y));
a[y].emplace_back(make_pair(cost, x));
}
f.close();
C[0] = 1, C[k + 1] = n;
}
priority_queue<pair, vector<pair>, greater<pair>> Q;
void dijkstra(int x) {
int i;
Q.push({0, x});
dmin[x] = 0;
while (!Q.empty()) {
pair x = Q.top();
Q.pop();
if (x.first != dmin[x.second]) continue;
for (i = 0; i < a[x.second].size(); i++) {
pair cur = a[x.second][i];
if (dmin[cur.second] > dmin[x.second] + cur.first) {
dmin[cur.second] = dmin[x.second] + cur.first;
Q.push({dmin[cur.second], cur.second});
}
}
}
}
void solve() {
int i, j, mask;
for (i = 0; i <= k; i++) {
for (j = 1; j <= n; j++)
dmin[j] = Inf;
dijkstra(C[i]);
for (j = 1; j <= n; j++)
dp[C[i]][j] = dmin[j];
}
for (mask = 0; mask < (1 << (k + 2)); mask++)
for (i = 0; i <= k + 1; i++)
sol[mask][i] = Inf;
sol[1][0] = 0;
for (mask = 1; mask < (1 << (k + 2)); mask++)
for (i = 1; i <= k + 1; i++)
if (mask & (1 << i))
for (j = 0; j <= k; j++)
if (i != j && (mask & (1 << j)))
sol[mask][i] = min(sol[mask][i], sol[mask ^ (1 << i)][j] + dp[C[j]][C[i]]);
}
void output() {
ofstream g("ubuntzei.out");
g << sol[(1 << (k + 2)) - 1][k + 1];
g.close();
}
int main() {
read();
solve();
output();
return 0;
}