Pagini recente » Cod sursa (job #932661) | Cod sursa (job #133199) | Cod sursa (job #1359126) | Cod sursa (job #19509) | Cod sursa (job #2790205)
// Inca nu e transformat din ideea cu pq
#include <cstring>
#include <fstream>
#include <set>
#include <vector>
#define MARE 0x7f7f7f7f
#define LIMITA 50001
using namespace std;
struct VECIN {
int nn; // numarul nodului
unsigned short int cost;
};
int i, n, m, x, y, s, d[LIMITA];
unsigned short int c;
vector<VECIN> vv[LIMITA];
bool sel[LIMITA];
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
void dijkstra(int s) {
int nmin, dn;
set<pair<int, unsigned short int>> mn; // distanta, numarul nodului
memset(d, 0x7f, sizeof d);
d[s] = 0;
mn.insert(make_pair(0, 1)); // Punem sursa in coada
while (not mn.empty()) {
nmin = mn.begin()->second;
mn.erase(mn.begin());
if (not sel[nmin]) { // Este posibil sa fi scos din coada un nod selectat.
sel[nmin] = true; // retinem nodul care ne da minimul [nmin]
for (auto v : vv[nmin]) // doar vecinii lui nmin [*]
if (not sel[v.nn]) {
dn = d[nmin] + v.cost; // calculam distanta noua, folosind nmin.
if (d[v.nn] > dn) { // Daca am gasit un lant mai scurt prin nmin,
d[v.nn] = dn; // actualizam distanta de la sursa la nv.
mn.insert(make_pair(dn, v.nn)); // Punem nodul in coada.
}
}
}
}
}
int main() {
fin >> n >> m;
for (i = 1; i <= m; i++) {
fin >> x >> y >> c;
vv[x].push_back({y, c}); // vectori de vecini
}
dijkstra(1);
for (i = 2; i <= n; i++) {
if (d[i] == MARE)
fout << "0 ";
else
fout << d[i] << ' ';
}
return 0;
}