Pagini recente » Cod sursa (job #37048) | Cod sursa (job #618852) | Cod sursa (job #113579) | Cod sursa (job #37072) | Cod sursa (job #43856)
Cod sursa(job #43856)
#include <cstdio>
#include <string.h>
#define Nmax 512
#define Pmax 64
#define INF 0x3f3f3f3f
int n, m, p;
int cost[Nmax][Nmax], mat[Nmax][Pmax], home[Pmax], dist[Nmax], g[Nmax], d[Pmax][Pmax][Nmax];
void citire()
{
int i, a, b, c;
memset(cost, 0x3f, sizeof(cost));
scanf("%d", &p);
scanf("%d", &n);
scanf("%d", &m);
for (i = 1; i <= m; ++i)
{
scanf("%d %d %d", &a, &b, &c);
cost[a][b] = cost[b][a] = c;
}
for (i = 1; i <= p; ++i)
scanf("%d", &home[i]);
}
void dijkstra(int s)
{
int i, j, best, ct, nod;
memset(dist, 0x3f, sizeof(dist));
dist[s] = 0;
ct = n;
for (i = 1; i <= n; ++i)
g[i] = i;
for (i = 1; i <= n; ++i)
{
best = 1;
for (j = 1; j <= ct; ++j)
if (dist[g[j]] < dist[g[best]])
best = j;
nod = g[best];
g[best] = g[ct--];
for (j = 1; j <= n; ++j)
if (dist[nod] + cost[nod][j] < dist[j])
dist[j] = dist[nod] + cost[nod][j];
}
}
void solve()
{
int i, j, nod, k, dif;
for (i = 1; i <= p; ++i)
{
dijkstra(home[i]);
for (j = 1; j <= n; ++j)
mat[j][i] = dist[j];
}
for (dif = 0; dif < n; ++dif)
for (i = 1; i + dif <= n; ++i)
{
j = i + dif;
for (nod = 1; nod <= n; ++nod)
{
d[i][j][nod] = INF;
for (k = i; k <= j; ++k)
if (mat[nod][k] + d[i][k - 1][home[k]] + d[k + 1][j][home[k]] < d[i][j][nod])
d[i][j][nod] = mat[nod][k] + d[i][k - 1][home[k]] + d[k + 1][j][home[k]];
}
}
printf("%d\n", d[1][p][1]);
}
int main()
{
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
citire();
solve();
return 0;
}