Pagini recente » Cod sursa (job #33187) | Cod sursa (job #2726094) | Cod sursa (job #2865537) | Cod sursa (job #1955216) | Cod sursa (job #732921)
Cod sursa(job #732921)
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn = 510;
const int maxp = 52;
const int INF = 50000000;
int DIN[maxp][maxp][maxn];
int DEST[maxp],M,P,N;
int DIST[maxn][maxn];
int DISTC[maxn];
int ST[maxn * 6];
int VER[maxn];
int solve(int st,int dr,int nod)
{
if (st > dr) return 0;
if (DIN[st][dr][nod] != -1) return DIN[st][dr][nod];
int cur = INF;
for(int i = st;i <= dr; ++i)
{
cur = min(cur,solve(st,i - 1,DEST[i]) + solve(i + 1,dr,DEST[i]) + DIST[nod][DEST[i]]);
}
DIN[st][dr][nod] = cur;
return cur;
}
int main()
{
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d\n",&P);
scanf("%d\n",&N);
for(int i = 1;i <= N; ++i)
for(int j = 1;j <= N; ++j) DIST[i][j] = INF;
for(int i = 1;i <= N; ++i) DIST[i][i] = 0;
for(int i = 1;i <= P; ++i)
for(int j = 1;j <= P; ++j)
for(int k = 1;k <= N; ++k) DIN[i][j][k] = -1;
scanf("%d\n",&M);
for(int i = 1;i <= M; ++i)
{
int x,y,c;
scanf("%d %d %d\n",&x,&y,&c);
DIST[x][y] = min(DIST[x][y],c);
DIST[y][x] = min(DIST[y][x],c);
}
for(int j = 1;j <= P; ++j ) scanf("%d ",&DEST[j]);
DEST[0] = 1;
for(int k = 0;k <= P; ++k)
{
for(int j = 1;j <= N; ++j)
DISTC[j] = INF;
DISTC[DEST[k]] = 0;
ST[ST[0] = 1] = DEST[k];
VER[DEST[k]] = 1;
for(int i = 1;i <= ST[0]; ++i)
{
int nodcur = ST[i];
for(int j = 1;j <= N; ++j)
{
if (DISTC[j] > DISTC[nodcur] + DIST[nodcur][j])
{
DISTC[j] = DISTC[nodcur] + DIST[nodcur][j];
if (!VER[j])
{
ST[++ST[0]] = j;
VER[j] = 1;
}
}
}
VER[nodcur] = 0;
}
for(int i = 1;i <= N; ++i)
DIST[DEST[k]][i] = DISTC[i];
}
printf("%d\n",solve(1,P,1));
return 0;
}