Cod sursa(job #605845)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 2 august 2011 14:20:40
Problema Team Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<cstdio>
#include<fstream>
#include<iostream>
using namespace std;
int n,m,p;
int C[505][505],D[52];
int d[505][505];
int cost[52][52][52];
bool M[505];
int X[505];

void Citire()
{
	int i,j,x,y,c;
	freopen("team.in","r",stdin);
	scanf("%d %d %d",&p,&n,&m);
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			C[i][j]=2000000000;
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&x,&y,&c);
		C[x][y]=C[y][x]=c;
	}
	D[0]=1;
	for(i=1;i<=p;i++)
		scanf("%d",D+i);
}

inline int Min(int a,int b)
{
	if(a<b)
		return a;
	return b;
}

void Dijkstra(int x0)
{
	int i,j,vfmin,dmin;
	for(i=1;i<=n;i++)
	{
		X[i]=2000000000;
		M[i]=false;
	}
	X[x0]=0;
	for(i=1;i<=n;i++)
	{
		dmin=2000000000;
		for(j=1;j<=n;j++)
			if(M[j]==false && X[j]<dmin)
			{
				dmin=X[j];
				vfmin=j;
			}
		M[vfmin]=true;
		for(j=1;j<=n;j++)
			if(M[j]==false && X[j]>dmin+C[vfmin][j])
				X[j]=dmin+C[vfmin][j];
	}
}

void Rezolvare()
{
	int i,j,k;
	for(i=0;i<=p;i++)
	{
		Dijkstra(D[i]);
		for(j=0;j<=p;j++)
			d[i][j]=X[D[j]];
	}
	for(i=0;i<=p;i++)
		for(j=0;j<=p;j++)
			for(k=0;k<=p;k++)
				cost[i][j][k]=2000000000;
}

int Cost(int x,int y,int k)
{
	if(x>y)
		return 0;
	if(cost[x][y][k]!=2000000000)
		return cost[x][y][k];
	if(x==y && y==k)
		return 0;
	int u;
	cost[x][y][k]=2000000000;
	for(u=x;u<=y;u++)
		cost[x][y][k]=Min(cost[x][y][k],d[k][u]+Cost(x,u-1,u)+Cost(u+1,y,u));
	return cost[x][y][k];
}

void Afisare()
{
	freopen("team.out","w",stdout);
	printf("%d\n",Cost(1,p,0));
}

int main()
{
	Citire();
	Rezolvare();
	Afisare();
	return 0;
}