Pagini recente » Cod sursa (job #1919888) | Cod sursa (job #1557133) | Cod sursa (job #2193805) | Cod sursa (job #3142975) | Cod sursa (job #3358609)
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
using PA = pair<int, int>;
ifstream fin("team.in");
ofstream fout("team.out");
int p, n, m;
int dest[55];
vector<PA> G[505];
int D[55][505];
int dp[55][55][505];
priority_queue<PA, vector<PA>, greater<PA>> Q;
void dijkstra(int start_node, int dist[]) {
for(int i = 1; i <= n; i++) {
dist[i] = INF;
}
dist[start_node] = 0;
Q.push({0, start_node});
while(!Q.empty()) {
int cost = Q.top().first;
int u = Q.top().second;
Q.pop();
if(cost > dist[u]) {
continue;
}
for(auto edge : G[u]) {
int vecin = edge.first;
int w = edge.second;
if(dist[u] + w < dist[vecin]) {
dist[vecin] = dist[u] + w;
Q.push({dist[vecin], vecin});
}
}
}
}
int main() {
fin >> p >> n >> m;
for(int i = 1; i <= m; i++) {
int x, y, z;
fin >> x >> y >> z;
G[x].push_back({y, z});
G[y].push_back({x, z});
}
for(int i = 1; i <= p; i++) {
fin >> dest[i];
}
fin.close();
for(int i = 1; i <= p; i++) {
dijkstra(dest[i], D[i]);
}
for(int L = 1; L <= p; L++) {
for(int i = 1; i <= p - L + 1; i++) {
int j = i + L - 1;
for(int u = 1; u <= n; u++) {
dp[i][j][u] = INF;
for(int k = i; k <= j; k++) {
int cost = D[k][u];
if(cost == INF) {
continue;
}
int st = (k > i) ? dp[i][k - 1][dest[k]] : 0;
int dr = (k < j) ? dp[k + 1][j][dest[k]] : 0;
if(st != INF && dr != INF) {
dp[i][j][u] = min(dp[i][j][u], cost + st + dr);
}
}
}
}
}
fout << dp[1][p][1] << "\n";
fout.close();
return 0;
}