Pagini recente » Monitorul de evaluare | Diferente pentru warm-up-2004/solutii intre reviziile 20 si 8 | Diferente pentru warm-up-2004/solutii intre reviziile 20 si 9 | Diferente pentru warm-up-2004/solutii intre reviziile 15 si 16 | Cod sursa (job #1036409)
#include<cstdio>
using namespace std;
int pers,i,j,k,n,m,x1,y11,nd[503],dp[53][53][503],rf[503][503];
void RoyFloyd()
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(rf[i][k]+rf[k][j]<rf[i][j]) rf[i][j]=rf[i][k]+rf[k][j];
}
int calc(int st,int dr,int nod)
{
if(st>dr) return 0;
if(st==dr) return rf[nod][nd[st]];
if(dp[st][dr][nod]!=-1) return dp[st][dr][nod];
int i,val;
dp[st][dr][nod]=10000000;
for(i=st;i<=dr;i++)
{
val=calc(st,i-1,nd[i])+rf[nod][nd[i]]+calc(i+1,dr,nd[i]);
if(val<dp[st][dr][nod]) dp[st][dr][nod]=val;
}
return dp[st][dr][nod];
}
int main()
{
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d",&pers);
scanf("%d",&n);
scanf("%d",&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j) rf[i][j]=1000000;
for(i=1;i<=pers;i++)
for(j=i;j<=pers;j++)
for(k=1;k<=n;k++)
dp[i][j][k]=-1;
for(i=1;i<=m;i++)
{
scanf("%d",&x1);
scanf("%d",&y11);
scanf("%d",&rf[y11][x1]);
rf[x1][y11]=rf[y11][x1];
}
for(i=1;i<=n;i++)
scanf("%d",&nd[i]);
//RoyFloyd();
printf("%d\n",calc(1,pers,1));
return 0;
}