Cod sursa(job #329533)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 6 iulie 2009 15:15:07
Problema Team Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 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 cst[Nmax][Nmax];
int cost[Nmin][Nmin][Nmin];
int C[Nmax][Nmax];
int viz[Nmax];
int xx,yy,cc;

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

void dijkstra(int nod)
{
	int i,j,k,x;
	memset(d,0x3f,sizeof(d));
	d[nod]=0;
	memset(viz,0,sizeof(viz));
	for (j=1;j<=n;++j)   
	{   
        x=Inf;   
        for (i=1;i<=n;++i)   
			if (!viz[i] && d[i]<x) 
			{
				x=d[i];
				k=i;
			}				
            for (i=1;i<=n;++i)   
				if (d[i]>d[k]+C[k][i]) 
					d[i]=d[k]+C[k][i];   
			viz[k]=1;   
	}
	
	/*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);
	memset(C,0x3f,sizeof(C));
	for (i=1;i<=m;++i)
	{
		scanf("%d %d %d", &xx, &yy, &cc);
		C[xx][yy]=cc;
		C[yy][xx]=cc;
    }
	
	for (i=1;i<=p;++i)
	{
		scanf("%d", &dist[i]);
		dijkstra(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;
}