Pagini recente » Cod sursa (job #384651) | Cod sursa (job #1548598) | Cod sursa (job #4681) | Cod sursa (job #2294726) | Cod sursa (job #110360)
Cod sursa(job #110360)
#include <stdio.h>
#define NMAX (1<<9)
#define PMAX (1<<6)
#define INF 666000666
#define MIN(a,b) (((a)<(b))?(a):(b))
int DP[PMAX][PMAX];
int Dist[NMAX], A[NMAX][NMAX], N, M, P, Dest[PMAX], F[NMAX], C[NMAX][NMAX];
void init()
{
int i, j;
for (i = 0; i < PMAX; i++)
for (j = 0; j < PMAX; j++) DP[i][j] = INF;
for (i = 0; i < NMAX; i++)
for (j = 0; j < NMAX; j++) C[i][j] = INF;
}
void read()
{
int i, j, k, d;
freopen("team.in", "r", stdin);
scanf("%d%d%d", &P, &N, &M);
for (k = 0; k < M; k++)
{
scanf("%d%d%d", &i, &j, &d);
C[i][j] = C[j][i] = d;
}
for (i = 1; i <= P; i++) scanf("%d", Dest+i);
}
void dijkstra(int s)
{
int i, j, k, min;
for (i = 0; i < NMAX; i++) Dist[i] = INF, F[i] = 0;
Dist[s] = 0;
for (j = 1; j <= N; j++)
{
min = INF;
for (i = 1; i <= N; i++)
if (!F[i]&&Dist[i]<min) min = Dist[i], k = i;
for (i = 1; i <= N; i++)
if (Dist[i]>Dist[k]+C[k][i]) Dist[i] = Dist[k]+C[k][i];
F[k] = 1;
}
}
void construct()
{
int i, j;
Dest[0] = 1;
for (i = 0; i <= P; i++)
{
dijkstra(Dest[i]);
for (j = 1; j <= P; j++) A[i][j] = Dist[Dest[j]];
}
Dest[0] = 1;
}
int solve(int last, int i, int j)
{
int k, cost;
if (i>j) return 0;
if (DP[i][j]<INF) return DP[i][j];
if (i==j&&last==j) return 0;
DP[i][j] = INF;
for (k = i; k <= j; k++)
{
cost = A[last][k]+solve(k,i,k-1)+solve(k,k+1,j);
DP[i][j] = MIN(DP[i][j], cost);
}
return DP[i][j];
}
void write()
{
int res = solve(0,1,P);
freopen("team.out", "w", stdout);
printf("%d\n", res);
}
int main()
{
init();
read();
construct();
write();
return 0;
}