Pagini recente » Cod sursa (job #2064123) | Cod sursa (job #2249974) | Cod sursa (job #2663398) | Cod sursa (job #2385036) | Cod sursa (job #1901724)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
struct cell {
int vec;
int cost;
};
struct minHeap {
bool operator () (cell &a, cell &b) {
return a.cost < b.cost; /// NU!?
}
};
int INF = 0x3f3f3f3f;
vector<cell> graf[2001];
//priority_queue<cell, vector<cell>, minHeap> heap;
queue<cell> coada;
int distDij[2002];
int traseu[17];
int dist[17][17];
int dinam[17][131072];
int n;
int minim (int a, int b) {
if (a < b) {
return a; /// NU
}
return b;
}
void reinitDij () {
for (int i = 0; i <= n; i++) {
distDij[i] = INF; /// NU
}
}
void dijkstra (int start) {
reinitDij();
distDij[start] = 0;
coada.push((cell){start, 0});
while (!coada.empty()) {
cell act = coada.front();
coada.pop();
//if (act.cost == distDij[act.vec]) {
for (vector<cell>::iterator it = graf[act.vec].begin(); it != graf[act.vec].end(); it++) {
if (distDij[act.vec] + it->cost < distDij[it->vec]) {
distDij[it->vec] = distDij[act.vec] + it->cost;
coada.push((cell){it->vec, distDij[it->vec]});
}
}
//}
}
}
int main() {
ifstream file_in ("ubuntzei.in");
ofstream file_out ("ubuntzei.out");
int m, k;
int u, v, cost;
int i, j;
file_in >> n >> m;
file_in >> k;
for (i = 1; i <= k; i++) {
file_in >> traseu[i];
}
for (i = 0; i < m; i++) {
file_in >> u >> v >> cost;
graf[u].push_back((cell){v, cost});
graf[v].push_back((cell){u, cost});
}
traseu[0] = 1;
traseu[++k] = n;
for (i = 0; i <= k; i++) {
dijkstra(traseu[i]);
for (j = 0; j <= k; j++) {
dist[i][j] = distDij[traseu[j]];
}
}
int config = 1 << (k + 1);
//void initDinam (int config, int k) {
for (int j = 0; j <= k; j++) {
for (int i = 0; i < config; i++) {
dinam[j][i] = INF;
}
}
//}
dinam[0][0] = 0;
for (int pas = 1; pas < config; pas++) {
for (i = 0; i <= k; i++) {
if (pas & (1 << i)) {
for (j = 0; j <= k; j++) {
if (pas & (1 << j)) {
dinam[i][pas] = minim(dinam[i][pas],
dinam[j][pas ^ (1 << i)] + dist[j][i]);
}
}
}
}
}
file_out << dinam[k][config - 1] << "\n";
return 0;
}