Pagini recente » Cod sursa (job #1420680) | Cod sursa (job #1037658) | Cod sursa (job #1817081) | Cod sursa (job #949680) | Cod sursa (job #2575396)
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
int n, m, start, inf = (1 << 30), d[2005], k, vec[17], suma, gasit, mat[2005][2005], b[17], minim = (1 << 30);
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;
}
}
}
}
void afis(int nr) {
int a = 1;
for(int i = 1; i <= nr; ++i){
// cout << suma << ' ' << a << ' ' << b[i] << ' ' << mat[a][b[i]] << '\n';
suma += mat[a][b[i]];
a = b[i];
}
// cout << suma << ' ' << a << ' ' << n << ' ' << mat[a][n] << '\n';
suma += mat[a][n];
if(minim > suma){
minim = suma;
}
suma = 0;
}
void back(int nr) {
for(int i = 1; i <= k; ++i) {
if(!ok[vec[i]]){
b[nr] = vec[i];
ok[vec[i]] = 1;
if(nr == k)
afis(nr);
else{
back(nr + 1);
}
ok[vec[i]] = 0;
}
}
}
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);
for(int i = 1; i <= n; ++i)
mat[1][i] = d[i];
for(int i = 1; i <= k; ++i) {
dijkstra(vec[i]);
for(int t = 1; t <= n; ++t)
mat[vec[i]][t] = d[t];
}
// for(int i = 1; i <= k; ++i, out << '\n')
// for(int j = 1; j <= n; ++j)
// cout << mat[vec[i]][j] << ' ';
if(k == 0)
out << mat[1][n];
else {
back(1);
out << minim;
}
return 0;
}