Pagini recente » Cod sursa (job #2566486) | Cod sursa (job #601437) | Cod sursa (job #19821) | Cod sursa (job #91004) | Cod sursa (job #1036433)
#include<cstdio>
using namespace std;
int ul,pers,i,j,k,n,m,x1,y11,nd[503],dp[53][53][503],cst[503][503],D[53][503],ap[503];
void Dijkstra(int nod,int d[])
{
int i,mini;
for(i=1;i<=n;i++)
{
d[i]=10000000;
ap[i]=0;
}
d[nod]=0;
ul=nod;
ap[nod]=1;
while(1)
{
for(i=1;i<=n;i++)
if(d[ul]+cst[ul][i]<d[i]) d[i]=d[ul]+cst[ul][i];
mini=10000000;
for(i=1;i<=n;i++)
if(d[i]<mini&&ap[i]==0)
{
mini=d[i];
ul=i;
}
if(mini==10000000) break;
ap[ul]=1;
}
}
int calc(int st,int dr,int nod)
{
if(st>dr) return 0;
if(st==dr) return D[st][nod];
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])+D[i][nod]+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) cst[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",&cst[y11][x1]);
cst[x1][y11]=cst[y11][x1];
}
for(i=1;i<=pers;i++)
scanf("%d",&nd[i]);
for(i=1;i<=pers;i++)
Dijkstra(nd[i],D[i]);
printf("%d\n",calc(1,pers,1));
return 0;
}