Pagini recente » Cod sursa (job #2663417) | Cod sursa (job #1934087) | Cod sursa (job #1949882) | Cod sursa (job #1296660) | Cod sursa (job #1756643)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#include <fstream>
#include <queue>
using namespace std;
#define pb push_back
#define mp make_pair
#define maxN 504
#define maxP 53
#define inf 1000000000
int p, n, m, i, j, k, x, y, c;
vector< pair<int, int> > list[maxN];
int dp[maxP][maxP][maxN];
int dist[maxN][maxN];
int dest[maxN];
priority_queue< pair<int, int> > H;
void dijk(int root) {
int i;
for (i = 1; i <= n; i++) dist[root][i] = inf;
dist[root][root] = 0;
H.push(mp(-0, root));
while (!H.empty()) {
int node = H.top().second;
int cost = -H.top().first;
H.pop();
if (dist[root][node] != cost) continue;
for (i = 0; i < list[node].size(); i++) {
int to = list[node][i].first;
int cc = list[node][i].second;
if (dist[root][to] <= dist[root][node] + cc) continue;
dist[root][to] = dist[root][node] + cc;
H.push(mp(-dist[root][to], to));
}
}
}
int compute(int l, int r, int node) {
if (l > r) return 0;
if (dp[l][r][node] != inf) return dp[l][r][node];
for (int i = l; i <= r; i++)
dp[l][r][node] = min(dp[l][r][node], compute(l, i - 1, dest[i]) + compute(i + 1, r, dest[i]) + dist[dest[i]][node]);
return dp[l][r][node];
}
int main()
{
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
scanf("%d%d%d", &p, &n, &m);
for (i = 1; i <= m; i++) {
scanf("%d%d%d", &x, &y, &c);
list[x].pb(mp(y, c));
list[y].pb(mp(x, c));
}
for (i = 1; i <= p; i++)
for (j = 1; j <= p; j++)
for (k = 1; k <= n; k++)
dp[i][j][k] = inf;
for (i = 1; i <= p; i++) {
scanf("%d", &dest[i]);
dijk(dest[i]);
dp[i][i][dest[i]] = 0;
}
printf("%d", compute(1, p, 1));
return 0;
}