Cod sursa(job #422386)

Utilizator radu_cppRadu Voroneanu radu_cpp Data 22 martie 2010 16:51:26
Problema Team Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
#include <algorithm>
#define INF 1000000000
#define MAXN 510
#define MAXP 51

using namespace std;

int A[MAXN][MAXN];
int dest[MAXP];
int drum[MAXP][MAXP];
int Dij[MAXN];
bool ok[MAXN];
int d[MAXP][MAXP][MAXP];
int i,n,m,p,j,k,x,y,c;

inline void dijkstra(int nod)
{
	int minim,i,j;
	memset(ok,false, sizeof(ok));
	for (i=1; i<=n; i++)
		Dij[i] = INF;
	Dij[nod] = 0;
	for (j=1; j<=n; j++){
		minim = INF;
		nod = 0;
		for (i=1; i<=n; i++)
			if (!ok[i] && Dij[i]<minim){
				minim = Dij[i];
				nod = i;
			}
		if (minim == INF) break;
		ok[nod] = true;
		for (i=1; i<=n; i++)
			if (!ok[i] && Dij[i] > Dij[nod]+A[i][nod])
				Dij[i] = Dij[nod] + A[i][nod];
	}
}

inline int calcul(int x, int y, int source)
{
	if (x>y) return 0;
	if (x==y&&y==source) return 0;
	if (d[x][y][source]<INF) return d[x][y][source];
	int aux;
	d[x][y][source] = INF;
	for (aux=x; aux<=y; aux++)
		d[x][y][source] = min(d[x][y][source], calcul(x,aux-1,aux)+calcul(aux+1,y,aux)+drum[source][aux]);
	return d[x][y][source];
}

int main()
{
	freopen("team.in","r",stdin);
	freopen("team.out","w",stdout);
	scanf("%d",&p);
	scanf("%d",&n);
	scanf("%d",&m);
	for (i=1; i<=n; i++)
		for (j=1; j<=n; j++)
			A[i][j] = INF;
	for (i=1; i<=m; i++){
		scanf("%d %d %d",&x,&y,&c);
		A[x][y] = A[y][x] = c;
	}
	for (i=1; i<=p; i++)
		scanf("%d",&dest[i]);
	dest[0] = 1;
	for (i=0; i<=p; i++){
		dijkstra(dest[i]);
		for (j=1; j<=p; j++)
			drum[i][j] = Dij[dest[j]];
	}
	for (i=0; i<=p; i++)
		for (j=0; j<=p; j++)
			for (k=0; k<=p; k++)
				d[i][j][k] = INF;
	printf("%d\n",calcul(1,p,0));
	return 0;
}