Pagini recente » Cod sursa (job #488164) | Cod sursa (job #2472281) | Cod sursa (job #945916) | Cod sursa (job #2886995) | Cod sursa (job #1620693)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
class PriorityQ {
public:
int node, dist;
};
class Graph {
public:
int node, road;
};
class cmp {
public:
inline bool operator ()(PriorityQ a, PriorityQ b) {
return a.dist > b.dist;
}
};
vector <Graph> G[2005];
vector <int> frd, bkt_stk;
priority_queue <PriorityQ, vector <PriorityQ>, cmp> prioQ;
int k, n, m, dist[2005][2005], max_sum;
void dijkstra(int st) {
prioQ.push({st, 0});
dist[st][st] = 0;
while(!prioQ.empty()) {
PriorityQ frn = prioQ.top();
prioQ.pop();
for(auto nxt: G[frn.node]) {
int new_dist = frn.dist + nxt.road;
if(new_dist > dist[st][nxt.node]) {
continue;
}
dist[st][nxt.node] = new_dist;
prioQ.push({nxt.node, new_dist});
}
}
}
void bkt(int step) {
if(step > k + 1) {
int sum = dist[1][n];
if(!frd.size()) {
max_sum = sum;
return;
}
sum = dist[1][frd[0]];
if((int) bkt_stk.size() != k + 1) {
return;
}
for(int i = 0; i < (int) k - 1; ++i) {
sum += dist[frd[bkt_stk[i] - 1]][frd[bkt_stk[i + 1] - 1]];
}
max_sum = max(max_sum, sum + dist[frd[bkt_stk[k - 1] - 1]][n]);
return;
}
bkt(step + 1);
bkt_stk.push_back(step);
bkt(step + 1);
bkt_stk.pop_back();
}
int main() {
cin >> n >> m >> k;
for(int i = 1; i <= k; ++i) {
int x;
cin >> x;
frd.push_back(x);
}
for(int i = 1; i <= m; ++i) {
int a, b, d;
cin >> a >> b >> d;
G[a].push_back({b, d});
G[b].push_back({a, d});
}
memset(dist, INF, sizeof dist);
dijkstra(1);
for(auto it: frd) {
dijkstra(it);
}
bkt_stk.push_back(1);
bkt(2);
/*for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
cout << dist[i][j] << ' ';
}
cout << '\n';
}*/
cout << max_sum << '\n';
return 0;
}