Pagini recente » Cod sursa (job #826968) | Cod sursa (job #410866) | Cod sursa (job #2483374) | Cod sursa (job #3188064) | Cod sursa (job #182421)
Cod sursa(job #182421)
#include <cstdio>
#include <cstring>
#define INFI 0x3f3f3f3f
#define MAXN 512
#define MAXP 64
int P, N, M;
int G[MAXN], H[MAXN], Dist[MAXN], D[MAXN][MAXN], C[MAXN][MAXN], MIN[MAXP][MAXP][MAXN];
void Dijkstra(int s)
{
memset(Dist, 0x3f, sizeof(Dist));
Dist[s] = 0;
int i, j, k, nod, best;
for(i=1; i<=N; ++i)
G[i] = i;
k = N;
for(i=1; i<=N; ++i) {
best = 1;
for(j=1; j<=k; ++j)
if(Dist[G[j]] < Dist[G[best]])
best = j;
nod = G[best];
G[best] = G[k--];
for(j=1; j<=N; ++j)
if(Dist[j] > Dist[nod] + C[nod][j])
Dist[j] = Dist[nod] + C[nod][j];
}
}
int main()
{
freopen("team.in", "rt", stdin);
freopen("team.out", "wt", stdout);
memset(C, 0x3f, sizeof(C));
scanf("%d", &P);
scanf("%d", &N);
scanf("%d", &M);
int i, j, k, d, nod, x, y, z;
for(i=1; i<=M; ++i) {
scanf("%d %d %d", &x, &y, &z);
C[x][y] = z;
C[y][x] = z;
}
for(i=1; i<=P; ++i) {
scanf("%d", &H[i]);
Dijkstra(H[i]);
for(j=1; j<=N; ++j)
D[i][j] = Dist[j];
}
for(d=0; d<P; ++d)
for(i=1; i+d<=P; ++i) {
j = i + d;
for(nod=1; nod<=N; ++nod) {
MIN[i][j][nod] = INFI;
for(k=i; k<=j; ++k)
if(MIN[i][j][nod] > MIN[i][k-1][H[k]] + MIN[k+1][j][H[k]] + D[k][nod])
MIN[i][j][nod] = MIN[i][k-1][H[k]] + MIN[k+1][j][H[k]] + D[k][nod];
}
}
printf("%d", MIN[1][P][1]);
fclose(stdin);
fclose(stdout);
return 0;
}