Cod sursa(job #295581)

Utilizator mariusdrgdragus marius mariusdrg Data 3 aprilie 2009 14:08:55
Problema Team Scor 40
Compilator cpp Status done
Runda Simulare Marime 1.25 kb
#include<stdio.h>
#include<algorithm>


using namespace std;


const int maxn = 510;
const int maxp = 52;
const int INF = 50000000;
int DIN[maxp][maxp][maxn];
int DEST[maxp],M,P,N;
int DIST[maxn][maxn];


int solve(int st,int dr,int nod)
{
	if (st > dr) return 0;
	if (DIN[st][dr][nod] != -1) return DIN[st][dr][nod];
	int cur = INF;
	for(int i = st;i <= dr; ++i)
	{
		cur = min(cur,solve(st,i - 1,DEST[i]) + solve(i + 1,dr,DEST[i]) + DIST[nod][DEST[i]]);
	}
	DIN[st][dr][nod] = cur;
	return cur;
}


int main()
{
	freopen("team.in","r",stdin);
	freopen("team.out","w",stdout);
	scanf("%d\n",&P);
	scanf("%d\n",&N);
	for(int i = 1;i <= N; ++i)
		for(int j = 1;j <= N; ++j) DIST[i][j] = INF;
	for(int i = 1;i <= N; ++i) DIST[i][i] = 0;
	for(int i = 1;i <= P; ++i)
		for(int j = 1;j <= P; ++j)
			for(int k = 1;k <= N; ++k) DIN[i][j][k] = -1;
	scanf("%d\n",&M);
	for(int i = 1;i <= M; ++i)
	{
		int x,y,c;
		scanf("%d %d %d\n",&x,&y,&c);
		DIST[x][y] = min(DIST[x][y],c);
		DIST[y][x] = min(DIST[y][x],c);
	}
	for(int j = 1;j <= P; ++j ) scanf("%d ",&DEST[j]);
	for(int k = 1;k <= N; ++k)
		for(int i = 1;i <= N; ++i)
			for(int j = 1;j <= N; ++j)
				if (DIST[i][j] > DIST[i][k] + DIST[k][j]) DIST[i][j] = DIST[i][k] + DIST[k][j];
	printf("%d\n",solve(1,P,1));
	return 0;
}