Pagini recente » Cod sursa (job #820839) | Cod sursa (job #2731743) | Cod sursa (job #1252305) | Cod sursa (job #1498305) | Cod sursa (job #2717043)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
const int oo = (1 << 16) + 1;
int n, m, k, c[2001], d[2001];
bool inCoada[2001];
struct compara {
bool operator()(int a, int b) {
return d[a] > d[b];
}
};
vector < pair < int, int > > G[2001];
priority_queue< int, vector < int >, compara > Q;
void dijkstra(int nod) {
for (int i = 1; i <= n; i++)d[i] = oo;
d[nod] = 0;
Q.push(nod);
inCoada[nod] = true;
while (!Q.empty()) {
int nod_curent = Q.top();
Q.pop();
inCoada[nod_curent] = false;
for (unsigned int i = 0; i < G[nod_curent].size(); i++) {
int vecin = G[nod_curent][i].first;
int cost = G[nod_curent][i].second;
if (d[vecin] > d[nod_curent] + cost) {
d[vecin] = d[nod_curent] + cost;
if (inCoada[vecin] == false) {
inCoada[vecin] = true;
Q.push(vecin);
}
}
}
}
}
int main() {
ios::sync_with_stdio(false);
in.tie(NULL), out.tie(NULL);
in >> n >> m >> k;
for (int i = 1; i <= k; i++) in >> c[i];
for (int i = 1; i <= m; i++) {
int x, y, c;
in >> x >> y >> c;
G[x].push_back(make_pair(y, c));
G[y].push_back(make_pair(x, c));
}
int nod_start = 1, dis = 0, aux = 0, ck = k;
while (aux != k) {
int minim = oo;
int v = 0, indice;
dijkstra(nod_start);
for (int i = 1; i <= ck; i++) {
if (minim > d[c[i]]) {
minim = d[c[i]];
v = c[i];
indice = i;
}
}
nod_start = v;
aux++;
for (int i = indice; i < ck; i++) c[i] = c[i + 1];
ck--;
dis += d[v];
}
dijkstra(nod_start);
out << dis + d[n];
return 0;
}