Pagini recente » Cod sursa (job #2919695) | Cod sursa (job #39127) | Cod sursa (job #2781305) | Cod sursa (job #2943081) | Cod sursa (job #1780615)
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream fin("team.in");
ofstream fout("team.out");
const int dimn = 505;
const int dimp = 55;
const int inf = 0x3f3f3f3f;
int p, n, m;
int edgeCost[dimn][dimn], d[dimp], cost[dimp][dimp];
int dp[dimp][dimp][dimp];
int dist[dimn], ok[dimn];
void Dijkstra(int source) {
memset(dist, inf, sizeof dist);
memset(ok, false, sizeof ok);
dist[source] = 0;
for (int i = 1; i <= n; ++i) {
int node = 0;
for (int j = 1; j <= n; ++j)
if (!ok[j] && dist[node] > dist[j])
node = j;
ok[node] = true;
for (int j = 1; j <= n; ++j)
if (!ok[j] && dist[node] + edgeCost[node][j] < dist[j])
dist[j] = dist[node] + edgeCost[node][j];
}
}
int Solve(int begin, int end, int from) {
if (begin > end || (begin == end && begin == from))
return 0;
if (dp[begin][end][from] != inf)
return dp[begin][end][from];
for (int split = begin; split <= end; ++split)
dp[begin][end][from] = min(dp[begin][end][from],
Solve(begin, split - 1, split) + Solve(split + 1, end, split) + cost[from][split]);
return dp[begin][end][from];
}
int main() {
fin >> p >> n >> m;
memset(edgeCost, inf, sizeof edgeCost);
for (int i = 1; i <= m; ++i) {
int x, y, c;
fin >> x >> y >> c;
edgeCost[x][y] = edgeCost[y][x] = c;
}
d[0] = 1;
for (int i = 1; i <= p; ++i)
fin >> d[i];
memset(cost, inf, sizeof cost);
for (int i = 0; i <= p; ++i) {
Dijkstra(d[i]);
for (int j = 0; j <= p; ++j)
cost[i][j] = dist[d[j]];
}
memset(dp, inf, sizeof dp);
fout << Solve(1, p, 0) << '\n';
return 0;
}
//Trust me, I'm the Doctor!