Cod sursa(job #36086)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 22 martie 2007 22:29:51
Problema Team Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#include <string.h>

#define MAXN 505
#define MAXP 55

int P, N, M;
int d[MAXN];
int dist[MAXN][MAXN];
int nr[MAXN][MAXP][MAXP];

int solve( int k, int l, int r )
{
	if (nr[k][l][r] != -1)
		return nr[k][l][r];

	if (l == r)
		return dist[k][ d[l] ];

	int rez = 0, found = 0, last = l;
	for (int i = l; i <= r; i++)
		if (d[i] == k)
		{
			found = 1;
			rez += solve(k, last, i - 1);
			last = i + 1;
		}
	if (found)
		return nr[k][l][r] = rez;

	for (int i = l; i <= r; i++)
	{
		rez = dist[k][ d[i] ] + solve( d[i], l, r );
		if (rez > nr[k][l][r])
			nr[k][l][r] = rez;
	}
	return nr[k][l][r];
}

int main()
{
	freopen("team.in", "rt", stdin);
	freopen("team.out", "wt", stdout);

	memset(dist, 0x3f, sizeof(dist));
	memset(nr, -1, sizeof(nr));
	for (scanf("%d %d %d", &P, &N, &M); M; M--)
	{
		int i, j, k;
		scanf("%d %d %d", &i, &j, &k);
		dist[i][j] = dist[j][i] = k;
	}
	for (int i = 1; i <= N; i++)
		scanf("%d", d + i),
		dist[i][i] = 0;

	for (int k = 1; k <= N; k++)
		for (int i = 1; i <= N; i++)
			for (int j = 1; j <= N; j++)
				if (dist[i][k] + dist[k][j] < dist[i][j])
					dist[i][j] = dist[i][k] + dist[k][j];
	
	printf("%d\n", solve(1, 1, P));

	return 0;
}