Pagini recente » Cod sursa (job #53564) | Cod sursa (job #133853) | Cod sursa (job #1838056) | Cod sursa (job #19386) | Cod sursa (job #329536)
Cod sursa(job #329536)
#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][Nmax];
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;
}