Cod sursa(job #296189)
#include <stdio.h>
#include <vector>
#include <string.h>
#include <queue>
#define mp make_pair
#define pb push_back
#define maxn 550
#define maxp 55
using namespace std;
long len, n, m, p, c[maxn][maxn], dest[maxn], a, b, cost, nod, fiu, f[maxn], c1, c2, dist, co;
short int coa[maxn*maxn];
long d[maxp][maxp][maxp];
vector <long> v[maxn], w[maxn];
priority_queue < pair<long, long> > g;
long min(long a, long b)
{
if(a<b) return a;
return b;
}
int main()
{
long i, j, k;
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
scanf("%d%d%d", &p, &n, &m);
for(i=1; i<=m; i++)
{
scanf("%d %d %d", &a, &b, &cost);
v[a].pb(b);
v[b].pb(a);
w[a].pb(cost);
w[b].pb(cost);
}
long inf = 500000000;
for(i=0; i<=n; i++)
{
for(j=0; j<=n; j++)
{
c[i][j]=inf;
}
}
for(i=0; i<=p+1; i++)
{
for(j=0; j<=p+1; j++)
{
for(k=0; k<=p+1; k++)
{
d[i][j][k]=inf;
}
}
}
for(i=1; i<=p; i++)
{
scanf("%d", &dest[i]);
}
dest[p+1]=1;
for(i=1; i<=p+1; i++)
{
len=dest[i];
while(!g.empty()) g.pop();
g.push(mp(0, len));
c[len][len]=0;
while(!g.empty())
{
nod=g.top().second;
co=-(g.top().first);
g.pop();
f[nod]=0;
for(k=0; k<v[nod].size(); k++)
{
fiu=v[nod][k];
dist=co+w[nod][k];
if(c[len][fiu]>dist)
{
c[len][fiu]=dist;
g.push(mp(-dist, fiu));
}
}
}
}
/* for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
printf("%d ", c[i][j]);
}
printf("\n");
}*/
for(len=0; len<p; len++)
{
if(len)
{
for(i=1; i+len<=p; i++)
{
c1=i+len;
d[i][c1][i]=d[i+1][c1][i];
d[i][c1][c1]=d[i][c1-1][c1];
for(j=1; j<len; j++)
{
c2=i+j;
d[i][c1][c2]=d[i][c2-1][c2]+d[c2+1][c1][i+j];
}
}
}
else
{
for(i=1; i<=p; i++)
{
d[i][i][i]=0;
}
}
for(i=1; i+len<=p; i++)
{
for(j=0; j<=len; j++)
{
c1=i+len;
c2=i+j;
if(i>1) d[i][c1][i-1]=min(d[i][c1][i-1], d[i][c1][c2]+c[dest[i-1]][dest[c2]]);
if(i+len<=p) d[i][c1][c1+1]=min(d[i][c1][c1+1], d[i][c1][c2]+c[dest[c1+1]][dest[c2]]);
}
}
}
printf("%d\n", d[1][p][p+1]);
return 0;
}