Pagini recente » Cod sursa (job #1800918) | Cod sursa (job #468853) | Cod sursa (job #1166259) | Istoria paginii runda/simulare_de_oni_8/clasament | Cod sursa (job #1605939)
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <functional>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <bitset>
#include <stack>
#include <iomanip>
#define MOD 1000000007
#define NMAX 2005
#define INF 0x3f3f3f3f
using namespace std;
FILE *fin = freopen("ubuntzei.in", "r", stdin);
FILE *fout = freopen("ubuntzei.out", "w", stdout);
typedef pair<int, int> pii;
vector<int> prieteni;
int d[NMAX][NMAX];
int main() {
int n, m, i, j, k, p, x, y, c, res, sum;
cin >> n >> m >> p;
prieteni.resize(p + 1);
for (i = 1; i <= p; ++i)
cin >> prieteni[i];
for (i = 0; i <= n; ++i)
for (j = 0; j <= n; ++j)
d[i][j] = INF;
for (i = 0; i < n; ++i)
d[i][i] = 0;
for (i = 0; i < m; ++i) {
cin >> x >> y >> c;
d[x][y] = d[y][x] = c;
}
for (k = 1; k <= n; ++k)
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
if (i != k && i != j && j != k)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
if (p > 0) {
sort(prieteni.begin(), prieteni.end());
res = INF;
do {
sum = d[1][prieteni[1]] + d[prieteni[p]][n];
for (i = 1; i < p; ++i)
sum += d[prieteni[i]][prieteni[i + 1]];
res = min(res, sum);
} while (next_permutation(prieteni.begin(), prieteni.end()));
cout << res;
}
else
cout << d[0][n - 1];
return 0;
}