Pagini recente » Cod sursa (job #2361424) | Profil Djok | Cod sursa (job #1056052) | Cod sursa (job #199020) | Cod sursa (job #883591)
Cod sursa(job #883591)
#include <stdio.h>
#include<limits.h>
using namespace std;
int N, M, K, i, loc[2001], a[2001][2001], x, y, k, j, z, V[2001], min = INT_MAX, L;
int main() {
freopen ("ubuntzei.in", "r", stdin);
freopen ("ubuntzei.out", "w", stdout);
scanf ("%d %d %d", &N, &M, &K);
for (i = 1; i <= K; ++i)
scanf ("%d", &loc[i]);
for (i = 1; i <= M; ++i) {
scanf ("%d %d %d", &x, &y, &z);
a[x][y] = z;
a[y][x] = z;
}
for (k = 1; k <= N; k++)
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
if (a[i][k] && a[k][j] && (a[i][j] > a[i][k] + a[k][j] || !a[i][j]) && i != j)
a[i][j] = a[i][k] + a[k][j];
for (i = 1; i <= K; i++)
V[i] = i;
do {
L = a[1][loc[V[i]]];
if (L < min) {
for (int i = 2; i <= K; i++) {
L += a[loc[V[i-1]]][loc[V[i]]];
if (L >= min) i = K + 1;
}
if (L < min)
L += a[loc[V[K]]][N];
}
if (L < min)
min = L;
} while (next_permutation ( V + 1, V + K + 1));
printf("%d", min);
return 0;
}