Pagini recente » Cod sursa (job #31232) | Cod sursa (job #551940) | Cod sursa (job #2981756) | Cod sursa (job #1583831) | Cod sursa (job #295571)
Cod sursa(job #295571)
#include <stdio.h>
#include <algorithm>
using namespace std;
#define NMAX 510
#define INF 1000000010
int P, N, M;
int dist[NMAX][NMAX];
int d[NMAX];
int din[55][55][55];
char viz[55][55][55];
int calc(int x, int y, int k)
{
if (x > y) return 0;
if (viz[x][y][k]) return din[x][y][k];
int rez = INF;
for (int i = x; i <= y; i++)
rez = min(rez, calc(x, i - 1, i) + calc(i + 1, y, i) + dist[ d[k] ][ d[i] ]);
return din[x][y][k] = rez;
}
int main()
{
int i, j, k, x, y, c;
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
scanf("%d %d %d", &P, &N, &M);
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
if (i != j) dist[i][j] = INF;
for (i = 1; i <= M; i++) {
scanf("%d %d %d", &x, &y, &c);
dist[x][y] = min(dist[x][y], c);
dist[y][x] = min(dist[y][x], c);
}
for (k = 1; k <= N; k++)
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
for (i = 1; i <= P; i++) scanf("%d", &d[i]);
int rez = INF;
for (i = 1; i <= P; i++)
rez = min(rez, calc(1, i-1, i) + calc(i + 1, P, i) + dist[1][ d[i] ]);
printf("%d\n", rez);
return 0;
}