Pagini recente » Cod sursa (job #527309) | Cod sursa (job #2885925) | Cod sursa (job #315287) | Cod sursa (job #2369611) | Cod sursa (job #553036)
Cod sursa(job #553036)
#include <cstdio>
#include <cstring>
const int MAX_P = 51;
const int MAX_N = 501;
const int INF = 0x3f3f3f3f;
int p, n, m;
int a[MAX_P], f[MAX_N];
int v[MAX_N][MAX_N], dist[MAX_P][MAX_N];
int d[MAX_N][MAX_P][MAX_P];
int get(int nod, int st, int dr)
{
if (st > dr)
return 0;
if (st == dr)
return dist[st][nod];
if (d[nod][st][dr] != -1)
return d[nod][st][dr];
d[nod][st][dr] = INF;
for (int i = st; i <= dr; ++i)
{
int x = dist[i][nod] + get(a[i], st, i - 1) + get(a[i], i + 1, dr);
if (d[nod][st][dr] > x)
d[nod][st][dr] = x;
}
return d[nod][st][dr];
}
void dijkstra(int nod, int dist[])
{
int i;
memset(f, 0, sizeof(f));
for (i = 1; i <= n; ++i)
dist[i] = INF;
dist[nod] = 0;
while (1)
{
int mn = INF, p;
for (i = 1; i <= n; ++i)
if (!f[i] && mn > dist[i])
mn = dist[i], p = i;
if (mn == INF)
break;
f[p] = 1;
for (i = 1; i <= n; ++i)
if (dist[i] > dist[p] + v[p][i])
dist[i] = dist[p] + v[p][i];
}
}
int main()
{
int i;
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
scanf("%d %d %d", &p, &n, &m);
memset(v, INF, sizeof(v));
for (i = 1; i <= m; ++i)
{
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
v[x][y] = v[y][x] = z;
}
for (i = 1; i <= p; ++i)
{
scanf("%d", &a[i]);
dijkstra(a[i], dist[i]);
}
memset(d, -1, sizeof(d));
printf("%d\n", get(1, 1, p));
}