Pagini recente » Cod sursa (job #2980218) | Cod sursa (job #2980015) | Cod sursa (job #2980346) | Cod sursa (job #1003975) | Cod sursa (job #2575191)
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
ifstream in("dijkstra2.in");
ofstream out("dijkstra2.out");
int n, m, start, inf = (1 << 30), d[2005], k, vec[17], suma, gasit;
bool viz[2005], ok[2005];
struct muchie {
int x, y;
};
vector <muchie> v[10010];
struct comp {
bool operator() (int x, int y) {
return d[x] > d[y];
}
};
priority_queue <int, vector <int>, comp> Q;
void dijkstra(int start_node) {
for(int i = 1; i <= n; ++i){
d[i] = inf;
viz[i] = 0;
}
d[start_node] = 0;
Q.push(start_node);
viz[start_node] = 1;
while(!Q.empty()) {
int node_curent = Q.top();
Q.pop();
viz[node_curent] = 0;
for(unsigned int i = 0; i < v[node_curent].size(); ++i) {
int value = v[node_curent][i].y;
int vecin = v[node_curent][i].x;
if(d[vecin] > d[node_curent] + value){
d[vecin] = d[node_curent] + value;
if(!viz[vecin])
Q.push(vecin), viz[vecin] = 1;
}
}
}
}
int main() {
in >> n >> m >> k;
for(int i = 1; i <= k; ++i)
in >> vec[i];
for(int i = 1; i <= m; ++i) {
int a, b, val;
in >> a >> b >> val;
v[a].push_back({b, val});
v[b].push_back({a, val});
}
dijkstra(1);
ok[1] = 1;
while(true) {
int minim = (1 << 30), posmn;
gasit = 0;
for(int i = 1; i <= k; ++i) {
if(!ok[vec[i]]) {
if(minim > d[vec[i]]) {
minim = d[vec[i]];
posmn = vec[i];
gasit = 1;
}
}
}
if(gasit == 1){
ok[posmn] = 1;
suma += d[posmn];
dijkstra(posmn);
}
else
break;
}
out << suma + d[n];
return 0;
}