Cod sursa(job #35439)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 22 martie 2007 01:54:26
Problema Team Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <stdio.h>
#include <string.h>
#define nmax 511
#define pmax 55
#define mmax 201100
#define inf 500111000
#define FOR(i,s,d) for(i=(s);i<(d);++i)

int n,m,p,z,nr[mmax],urm[mmax],v[nmax],ct[mmax],D[pmax],aux[nmax];
int a[nmax][pmax][pmax],viz[nmax],min[nmax][nmax];

void Vadd(int i,int j,int c)
{
	urm[++z]=v[i];
	v[i]=z, nr[z]=j, ct[z]=c;
}

void dijkstra(int s)
{
	int ii,j,i;
	FOR(i,1,n+1)
		aux[i]=inf;
	memset(viz,0,sizeof(viz));
	aux[s]=0;
	FOR(ii,0,n)
	{
		j=1;
		FOR(i,2,n+1)
			if(!viz[i]&&(viz[j]||(aux[i]<aux[j])))
				j=i;
		viz[j]=1;
		for(i=v[j];i;i=urm[i])
			if(aux[nr[i]]>aux[j]+ct[i])
				aux[nr[i]]=aux[j]+ct[i];
	}
	memcpy(min[s],aux,sizeof(aux));
}

int MIN(int x,int y)
{
	return x<y?x:y;
}

int doit(int x,int i,int j)
{
	int ii,aux;  
	if(a[x][i][j]==-1)
	{
		aux=inf;
		FOR(ii,i,j+1)
				aux=MIN(aux,min[x][D[ii]]+doit(D[ii],i,ii-1)+doit(D[ii],ii+1,j));
		a[x][i][j]=aux;
	}
	return a[x][i][j];    
}

int main()
{
	FILE *fi=fopen("team.in","r"),*fo=fopen("team.out","w");
	fscanf(fi,"%d",&p);
	fscanf(fi,"%d",&n);
	fscanf(fi,"%d",&m);
	int ii,i,j,ct;
	FOR(ii,0,m)
	{
		fscanf(fi,"%d %d %d",&i,&j,&ct);
		Vadd(i,j,ct);
		Vadd(j,i,ct);
	}
	FOR(i,1,p+1)
		fscanf(fi,"%d",&D[i]);        
	fclose(fi);
	FOR(ii,1,n+1) FOR(i,1,p+1) FOR(j,i,p+1)
		a[ii][i][j]=-1;
	D[0]=1;
	FOR(i,0,p+1)
		dijkstra(D[i]);
	fprintf(fo,"%d\n",doit(1,1,p));
	fclose(fo);
	return 0;
}