Pagini recente » Cod sursa (job #2913196) | Cod sursa (job #2354428) | Cod sursa (job #417344) | Cod sursa (job #254015) | Cod sursa (job #1482820)
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#define pb push_back
using namespace std;
const int MAXN = 201;
const int MAXK = 16;
int n, m, k;
int d[MAXN][MAXN] = {};
int adj[MAXN][MAXN] = {};
int main()
{
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
cin >> n >> m >> k;
vector<int> c(k + 1);
for (int i = 1; i <= k; ++i) {
cin >> c[i];
}
for (int i = 1; i <= m; ++i) {
int x, y, z;
cin >> x >> y >> z;
d[x][y] = d[y][x] = z;
adj[x][y] = adj[y][x] = 1;
}
for (int t = 1; t <= n; ++t) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (adj[i][t] && adj[t][j]) {
d[i][j] = min(d[i][j], d[i][t] + d[t][j]);
}
}
}
}
uint64_t minlen = ~0;
uint64_t perm[MAXK];
for (int i = 1; i <= k; ++i) {
perm[i] = i;
}
do {
uint64_t len = 0;
len += d[1][c[perm[1]]];
for (int i = 1; i <= k - 1; ++i) {
len += d[c[perm[i]]][c[perm[i + 1]]];
}
len += d[c[perm[k]]][n];
minlen = min(minlen, len);
} while (next_permutation(perm + 1, perm + 1 + k));
cout << minlen;
return 0;
}