Cod sursa(job #329526)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 6 iulie 2009 14:37:25
Problema Team Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstdio>
#include <cstring>

using namespace std;


#define file_in "team.in"
#define file_out "team.out"

#define Nmax 510
#define Nmin 65
#define Inf 0x3f3f3f3f


int n,p,m,dist[Nmax],ok;
int d[Nmax];
int x[Nmax],y[Nmax],c[Nmax];
int cst[Nmax][Nmax];
int cost[Nmin][Nmin][Nmin];

inline int min(int a, int b) { return a<b?a:b; }

void bellman(int nod)
{
	int i,j,k;
	memset(d,0,sizeof(d));
	
	for (i=1;i<=m;++i)
	{
		if (x[i]==nod)
			 d[y[i]]=c[i];
		if (y[i]==nod)
			 d[x[i]]=c[i];
	}
		
	d[nod]=0;
	for (i=1;i<=n;++i)
		  if (i!=nod)
			  d[i]=Inf;
	
	ok=0;
	while(!ok)
	{
		ok=1;
		for (i=1;i<=m;++i)
		{
			if (d[y[i]]>d[x[i]]+c[i])
				d[y[i]]=d[x[i]]+c[i],ok=0;
			if (d[x[i]]>d[y[i]]+c[i])
				d[x[i]]=d[y[i]]+c[i],ok=0;
		}
	}
	
	/*for (i=1;i<=n;++i)
		 printf("%d ", d[i]);
	printf("\n");*/
}

int main()
{

	int i,j,k,nod,ii;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &p);
	scanf("%d", &n);
	scanf("%d", &m);
	for (i=1;i<=m;++i)
	{
		scanf("%d %d %d", &x[i], &y[i], &c[i]);
    }
	
	for (i=1;i<=p;++i)
	{
		scanf("%d", &dist[i]);
		bellman(dist[i]);
	    for (j=1;j<=n;++j)
		     cst[j][i]=d[j];
	}

	for (ii=0;ii<p;++ii)   
        for (i=1;i+ii<=p;++i)   
        {   
            j=i+ii;   
            for (nod=1;nod<=n;++nod)   
            {   
                cost[i][j][nod]=Inf;   
                for (k=i;k<=j;++k)   
                    cost[i][j][nod]=min(cost[i][j][nod],cst[nod][k]+cost[i][k-1][dist[k]]+cost[k+1][j][dist[k]]);   
            }   
        }   
       
    printf("%d\n", cost[1][p][1]);   

	
	 
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}