Pagini recente » Cod sursa (job #38934) | Cod sursa (job #390704) | Cod sursa (job #3232334) | Cod sursa (job #2725113) | Cod sursa (job #296193)
Cod sursa(job #296193)
#include <stdio.h>
#include <vector>
#include <string.h>
#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, tot;
long q[maxn][maxn];
short int coa[maxn*maxn];
long d[maxp][maxp][maxp];
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);
long inf = 500000000;
for(i=0; i<=n; i++)
{
for(j=0; j<=n; j++)
{
c[i][j]=inf;
q[i][j]=inf;
}
}
for(i=1; i<=m; i++)
{
scanf("%d %d %d", &a, &b, &cost);
if(cost<q[a][b]) q[a][b]=cost;
if(cost<q[b][a]) q[b][a]=cost;
}
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++)
{
tot=1;
len=dest[i];
coa[1]=len;
c[len][len]=0;
for(j=1; j<=tot; j++)
{
nod=coa[j];
f[nod]=0;
for(fiu=1; fiu<=n; fiu++)
{
dist=q[nod][fiu]+c[len][nod];
if(c[len][fiu]>dist)
{
c[len][fiu]=dist;
if(!f[fiu])
{
coa[++tot]=fiu;
f[fiu]=1;
}
}
}
}
}
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;
}