Pagini recente » Cod sursa (job #2985071) | Cod sursa (job #2984732) | Cod sursa (job #2102474) | Cod sursa (job #15174) | Cod sursa (job #295581)
Cod sursa(job #295581)
#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 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]);
for(int k = 1;k <= N; ++k)
for(int i = 1;i <= N; ++i)
for(int j = 1;j <= N; ++j)
if (DIST[i][j] > DIST[i][k] + DIST[k][j]) DIST[i][j] = DIST[i][k] + DIST[k][j];
printf("%d\n",solve(1,P,1));
return 0;
}