Pagini recente » Cod sursa (job #2915900) | Cod sursa (job #9203) | Cod sursa (job #2790921) | Cod sursa (job #108627) | Cod sursa (job #1958859)
#include <fstream>
//19:49
using namespace std;
const int NMAX = 500 + 5;
const int PMAX = 50 + 5;
const int INF = 1E9 + 15;
int P, N, M;
int cost[NMAX][NMAX];
int dest[PMAX];
bool vis[NMAX];
void dijkstra(int node, int dist[]) {
for (int i = 1; i <= N; ++ i) {
vis[i] = false;
dist[i] = INF;
}
dist[node] = 0;
for (int i = 1; i <= N; ++ i) {
int best = INF;
int who = -1;
for (int j = 1; j <= N; ++ j)
if (!vis[j] && dist[j] < best)
best = dist[j], who = j;
vis[who] = true;
for (int j = 1; j <= N; ++ j)
if (dist[who] + cost[who][j] < dist[j])
dist[j] = dist[who] + cost[who][j];
}
}
int dist[PMAX][NMAX];
int dp[PMAX][PMAX][PMAX];
int main()
{
ifstream cin("team.in");
ofstream cout("team.out");
cin >> P >> N >> M;
for (int i = 1; i <= N; ++ i) {
for (int j = 1; j <= N; ++ j)
cost[i][j] = INF;
cost[i][i] = 0;
}
for (int i = 1; i <= M; ++ i) {
int a, b, c;
cin >> a >> b >> c;
if (c < cost[a][b])
cost[a][b] = cost[b][a] = c;
}
dest[0] = 1;
for (int i = 1; i <= P; ++ i)
cin >> dest[i];
for (int i = 0; i <= P; ++ i)
dijkstra(dest[i], dist[i]);
for (int l = P; l; -- l)
for (int r = l; r <= P; ++ r)
for (int node = 0; node <= P; ++ node) {
dp[l][r][node] = INF;
for (int inter = l; inter <= r; ++ inter) {
int aux = dp[l][inter - 1][inter] + dp[inter + 1][r][inter] + dist[node][dest[inter]];
if (aux < dp[l][r][node])
dp[l][r][node] = aux;
}
}
cout << dp[1][P][0] << '\n';
return 0;
}