Pagini recente » Cod sursa (job #18074) | Cod sursa (job #295783) | Cod sursa (job #199558) | Cod sursa (job #100813) | Cod sursa (job #329526)
Cod sursa(job #329526)
#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;
}