Pagini recente » Cod sursa (job #343826) | Cod sursa (job #91263) | Cod sursa (job #3230837) | Cod sursa (job #1717470) | Cod sursa (job #998531)
Cod sursa(job #998531)
#include<fstream>
#include<cstdio>
#define P 55
#define N 505
#define INF 999999999
using namespace std;
int i,n,m,p,j,k,cost,x,y,sol[P][P][N],c[P][N],d[P],viz[N],a[N][N];
inline void dijkstra(int s,int d[])
{
int mini,p;
for(int i=1;i<=n;++i)
{
d[i]=INF;
viz[i]=0;
}
d[s]=0;
for(int j=1;j<=n;++j)
{
mini=INF;
for(int i=1;i<=n;++i)
if(mini>d[i]&&!viz[i])
{
mini=d[i];
p=i;
}
if(mini==INF)
{
return;
}
viz[p]=1;
for(int i=1;i<=n;++i)
if(d[i]>d[p]+a[p][i])
{
d[i]=d[p]+a[p][i];
}
}
}
inline int rez(int li,int ls,int x)
{
if(li>ls)
return 0;
if(li==ls)
return c[li][x];
if(sol[li][ls][x]!=-1)
return sol[li][ls][x];
int mini=INF;
for(int i=li;i<=ls;++i)
{
mini=min(mini,c[i][x]+rez(li,i-1,d[i])+rez(i+1,ls,d[i]));
}
return mini;
}
int main()
{
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d%d%d",&p,&n,&m);
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
a[i][j]=INF;
for(i=1;i<=n;++i)
a[i][i]=0;
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&cost);
a[x][y]=a[y][x]=cost;
}
for(i=1;i<=p;++i)
{
scanf("%d",&d[i]);
dijkstra(d[i],c[i]);
}
for(i=1;i<=p;++i)
for(j=i;j<=p;++j)
for(k=1;k<=n;++k)
{
sol[i][j][k]=-1;
}
printf("%d\n",rez(1,p,1));
return 0;
}