Pagini recente » Cod sursa (job #3196791) | Cod sursa (job #2785651) | Cod sursa (job #1718576) | Cod sursa (job #4644) | Cod sursa (job #2305080)
#include <bits/stdc++.h>
#define int_pair std::pair <int, int>
#define MAXN 505
#define MAXP 55
#define inf 1000000005
int N, M, P;
int Dest[MAXP];
std::vector <int_pair> ADC[MAXN];
inline void AddEdge(int x, int y, int w) {
ADC[x].push_back({y, w});
ADC[y].push_back({x, w});
}
std::ifstream In("team.in");
std::ofstream Out("team.out");
std::priority_queue <int_pair> PQ;
int Dist[MAXP][MAXN];
int DP[MAXP][MAXP][MAXP];
void Dijkstra(int src, int D[]) {
for (int i=1; i<=N; ++i)
D[i] = inf;
D[src] = 0;
PQ.push({0, src});
int_pair Top;
while (!PQ.empty()) {
Top = PQ.top();
PQ.pop();
if (Top.first > D[Top.second]) continue;
for (auto Edge:ADC[Top.second])
if (D[Edge.first] > Top.first + Edge.second)
D[Edge.first] = Top.first + Edge.second,
PQ.push({D[Edge.first], Edge.first});
}
}
void Citire() {
In >> P >> N >> M;
for (int i=0, x, y, w; i<M; ++i)
In >> x >> y >> w, AddEdge(x, y, w);
for (int i=1; i<=P; ++i)
In >> Dest[i];
}
void Rezolvare() {
Dest[0] = 1;
for (int i=0; i<=P; ++i)
Dijkstra(Dest[i], Dist[i]);
for (int len=2, i, j, k; len<=P; ++len)
for (i=1; (i+len-1)<=P; ++i)
for (j=0; j<=P; ++j) {
DP[i][i+len-1][j] = inf;
for (k=i; k<=(i+len-1); ++k)
DP[i][i+len-1][j] = std::min(DP[i][i+len-1][j], DP[i][k-1][k] + DP[k+1][i+len-1][k] + Dist[j][Dest[k]]);
} Out << DP[1][P][0] << '\n';
}
int main()
{
Citire();
Rezolvare();
return 0;
}