Pagini recente » Diferente pentru template/algoritmiada-2009/header intre reviziile 25 si 7 | Cod sursa (job #3360450) | Cod sursa (job #3361687) | Cod sursa (job #3359799) | Cod sursa (job #3361732)
#include <bits/stdc++.h>
using namespace std;
#define USE_STD_IO 0
#if USE_STD_IO
#define fin cin
#define fout cout
#else
ifstream fin("team.in");
ofstream fout("team.out");
#endif
const int INF = 1e9 + 7;
struct Muchie {
int vec, cost;
};
vector<Muchie> gr[1002];
int p, n, m, i, j, k, dist[1002], v[1002];
int d[52][52][1002];
int drum[52][52];
bool viz[1002];
static inline void Dijkstra(int start) {
priority_queue<
array<int, 2>,
vector<array<int, 2>>,
greater<array<int, 2>>> q;
memset(viz + 1, false, n * sizeof(bool));
for(int i = 1; i <= n; i++) dist[i] = INF;
dist[start] = 0;
q.push({0, start});
int nod, cst;
while(!q.empty()) {
nod = q.top()[1];
cst = q.top()[0];
q.pop();
if(cst > dist[nod]) continue;
if(viz[nod]) continue;
viz[nod] = true;
for(Muchie mch : gr[nod]) {
if(!viz[mch.vec] && mch.cost + dist[nod] < dist[mch.vec]) {
dist[mch.vec] = mch.cost + dist[nod];
q.push({dist[mch.vec], mch.vec});
}
}
}
}
int main() {
#if USE_STD_IO
ios_base::sync_with_stdio(false);
#endif
fin.tie(NULL);
fout.tie(NULL);
fin >> p >> n >> m;
for(i = 1; i <= m; i++) {
int x, y, c;
fin >> x >> y >> c;
gr[x].push_back({y, c});
gr[y].push_back({x, c});
}
for(i = 1; i <= p; i++) fin >> v[i];
v[0] = 1;
for(i = 0; i <= p; i++) {
Dijkstra(v[i]);
for(j = 0; j <= p; j++) {
drum[i][j] = dist[v[j]];
}
}
for(i = 1; i <= p; i++) {
for(j = i; j <= p; j++) {
for(k = 0; k <= p; k++) {
d[i][j][k] = INF;
}
//memset(d[i][j], -1, (1 + p) * sizeof(int));
}
}
for(int lg = 1; lg <= p; lg++) {
for(j = lg; j <= p; j++) {
i = j - lg + 1;
for(k = i; k <= j; k++) {
for(int kk = 0; kk <= p; kk++) {
int mi = drum[kk][k];
if(i < k) mi += d[i][k - 1][k];
if(k < j) mi += d[k + 1][j][k];
if(mi < d[i][j][kk]) d[i][j][kk] = mi;
}
}
}
}
fout << d[1][p][0];
return 0;
}