Cod sursa(job #732386)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 10 aprilie 2012 13:48:02
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 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 DISTC[maxn];
int ST[maxn * 6];
int VER[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]);
	DEST[0] = 1;
	for(int k = 0;k <= P; ++k)
	{
		for(int j = 1;j <= N; ++j)
			DISTC[j] = INF;
		DISTC[DEST[k]] = 0;
		ST[ST[0] = 1] = DEST[k];
		VER[DEST[k]] = 1;
		for(int i = 1;i <= ST[0]; ++i)
		{
			int nodcur = ST[i];
			for(int j = 1;j <= N; ++j)
			{
				if (DISTC[j] > DISTC[nodcur] + DIST[nodcur][j])
				{
					DISTC[j] = DISTC[nodcur] + DIST[nodcur][j];
					if (!VER[j])
					{
						ST[++ST[0]] = j;
						VER[j] = 1;	
					}
				}
			}
			VER[nodcur] = 0;
		}
		for(int i = 1;i <= N; ++i)
			DIST[DEST[k]][i] = DISTC[i];
	}
	printf("%d\n",solve(1,P,1));
	return 0;
}