Pagini recente » Cod sursa (job #364283) | Cod sursa (job #3181021) | Cod sursa (job #799215) | Cod sursa (job #1410603) | Cod sursa (job #1021150)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin("team.in");
ofstream fout("team.out");
const int MAXP = 60;
const int MAXN = 510;
const int inf = 1 << 30;
int p, n, m;
int d[MAXP], dist[MAXP][MAXP], sol[MAXP][MAXP][MAXP];
vector < pair <int, int> > graf[MAXN];
void dijkstra(int nodStart, int v[]) {
int used[MAXN]; fill(used, used + MAXN, 0);
v[nodStart] = 0;
for (int i = 1; i < n; ++i) {
int nodMin = inf, poz;
for (int j = 1; j <= n; ++j)
if (!used[j] && v[j] < nodMin) {
nodMin = v[j];
poz = j;
}
used[poz] = 1;
for (auto it = graf[poz].begin(); it != graf[poz].end(); ++it)
if (v[(*it).first] > v[poz] + (*it).second)
v[(*it).first] = v[poz] + (*it).second;
}
}
int main() {
fin >> p >> n >> m;
for (int i = 1; i <= m; ++i) {
int x, y, c;
fin >> x >> y >> c;
graf[x].push_back(make_pair(y, c));
graf[y].push_back(make_pair(x, c));
}
for (int i = 1; i <= p; ++i)
fin >> d[i];
d[p + 1] = 1;
for (int i = 1; i <= p + 1; ++i) {
int v[MAXN]; fill(v, v + MAXN, inf);
dijkstra(d[i], v);
for (int j = 1; j <= p; ++j)
dist[i][j] = v[d[j]];
}
for (int i = 0; i < p; ++i)
for (int st = 1; st + i <= p; ++st)
for (int nod = st; nod <= st + i; ++nod) {
int rez1 = inf, rez2 = inf;
if (nod > st)
for (int k = st; k < nod; ++k)
rez1 = min (rez1, sol[k][st][(nod - st) - 1] + dist[nod][k]);
if (nod < st + i)
for (int k = nod + 1; k <= st + i; ++k)
rez2 = min (rez2, sol[k][nod + 1][(st + i - nod) - 1] + dist[nod][k]);
if (rez1 == inf) rez1 = 0;
if (rez2 == inf) rez2 = 0;
sol[nod][st][i] = rez1 + rez2;
}
int rez = inf;
for (int i = 1; i <= p; ++i)
rez = min (rez, sol[i][1][p - 1] + dist[p + 1][i]);
fout << rez;
return 0;
}