Pagini recente » Cod sursa (job #1531460) | Cod sursa (job #3126468) | Cod sursa (job #1275151) | Cod sursa (job #3126931) | Cod sursa (job #2788091)
#include <fstream>
#include <queue>
#include <tuple>
#include <vector>
#define MARE 100000000
#define LIMITA 50001
using namespace std;
struct VECIN {
int nn;
unsigned short int cost;
};
int i, n, m, x, y, s, d[LIMITA];
unsigned short int c;
vector<VECIN> vv[LIMITA];
priority_queue<pair<int, unsigned short int>> pq; // distanta, numarul nodului
bool sel[LIMITA];
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
void dijkstra(int s) {
int nmin, dn;
for (i = 2; i <= n; i++)
d[i] = MARE; // Initializam distanta fata de sursa.
d[s] = 0;
pq.push(make_pair(0, 1)); // Punem sursa in coada
while (not pq.empty()) { // Selectam cate un nod.
nmin = pq.top().second;
pq.pop();
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.
pq.push(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;
}