Pagini recente » Cod sursa (job #25855) | Cod sursa (job #731969)
Cod sursa(job #731969)
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
const int P = 55, N = 505, INF = 100 * 100 * 100 * 100;
int p, n, poz[P], dc[N], dist[P][P], d[P][P][P];
vector <pair <int, int> > L[N];
struct comp {
bool operator() (const int &a, const int &b) {
return d[a] < d[b];
}
};
priority_queue <int, vector <int>, comp> Q;
void read() {
int m, x, y, c;
scanf("%d%d%d", &p, &n, &m);
for (int i = 1; i <= m; ++i) {
scanf("%d%d%d", &x, &y, &c);
L[x].push_back(make_pair(y, c));
L[y].push_back(make_pair(x, c));
}
for (int i = 1; i <= p; ++i)
scanf("%d", &poz[i]);
}
inline int min(int x, int y) {
return x < y ? x : y;
}
void BF(int nod, int pc) {
bool inq[N];
for (int i = 0; i < N; ++i)
dc[i] = INF;
memset(inq, 0, sizeof(inq));
dc[nod] = 0;
Q.push(nod);
inq[nod] = 1;
while (!Q.empty()) {
int nc = Q.top(); inq[nc] = 0; Q.pop();
for (int i = 0; i < (int)L[nc].size(); ++i)
if (L[nc][i].second + dc[nc] < dc[L[nc][i].first]) {
dc[L[nc][i].first] = dc[nc] + L[nc][i].second;
if (!inq[L[nc][i].first])
Q.push(L[nc][i].first);
}
}
for (int i = 0; i <= p; ++i)
dist[pc][i] = dc[poz[i]];
}
void init() {
poz[0] = 1;
for (int i = 0; i <= p; ++i)
BF(poz[i], i);
}
int solve(int l, int r, int nod) {
if (l > r)
return 0;
if (d[l][r][nod] != INF)
return d[l][r][nod];
for (int i = l; i <= r; ++i)
d[l][r][nod] = min(d[l][r][nod], solve(l, i - 1, i) + solve(i + 1, r, i) + dist[nod][i]);
return d[l][r][nod];
}
int main() {
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
read();
init();
for (int i = 0; i < P; ++i)
for (int j = 0; j < P; ++j)
for (int k = 0; k < P; ++k)
d[i][j][k] = INF;
printf("%d\n", solve(1, p, 0));
return 0;
}