Cod sursa(job #295571)

Utilizator blahblahblahblah blahblah Data 3 aprilie 2009 13:53:39
Problema Team Scor 5
Compilator cpp Status done
Runda Simulare Marime 1.13 kb
#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;
}