Pagini recente » Cod sursa (job #834712) | Cod sursa (job #1390445) | Cod sursa (job #443684) | Cod sursa (job #1343884) | Cod sursa (job #1585367)
/// priority_queue se afla in libraria <queue>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream in("dijkstra.in");
ofstream out("dijkstra.out");
const int MAX_N = 100000;
const int INF = 0x7fffffff; /// Un truc, valoarea e scrisa in baza 16. Reprezinta cel mai mare numar care poate fi tinut pe int.
class Node {
public: /// Daca nu faci astea publice, nu merge.
int index; /// Indicele nodului.
int dist; /// Distanta pana la nod pe care o tin in heap.
bool operator <(const Node &other) const { /// Operatorul < pe care priority_queue il foloseste daca il gaseste in clasa.
return this->dist > other.dist; /// Semnul e invers. Heapul sorteaza dupa astea, dar tine si indicele. Ca si cum ai sorta un struct.
}
};
struct Edge { /// Edge : se tine minte pentru lista de adiacenta.
int other; /// Vecinul nodului.
int cost; /// Costul mucheiei.
};
int n, m;
int D[1 + MAX_N];
vector < Edge > adjList[1 + MAX_N];
priority_queue < Node > Q; /// priority_queue, declarat simplu pe clasa Node, fiindca are operator de < incorporat.
void dijkstra(int s) {
int u, d, v, c, i;
for(i = 1; i <= n; i++) D[i] = INF; /// Setez distantele pe INF.
D[s] = 0; /// Distanta pana la sursa este 0.
Q.push(Node{s, 0});
while(Q.empty() == false) { /// Cat timp inca mai am noduri in heap.
u = Q.top().index; /// u este indicele nodului
d = Q.top().dist; /// d este distanta pana la nodul cu distanta minima.
Q.pop(); /// Scot minimul din heap.
if(d == D[u]) { /// Verific daca nu cumva nodul era vechi si nu am nevoie de el.
for(i = 0; i < adjList[u].size(); i++) { /// Trec prin toti vecinii.
v = adjList[u][i].other; /// v este vecinul nodului u.
c = adjList[u][i].cost; /// c este costul muchiei (u, v).
if(D[v] > d + c) { /// Daca distanta pana la v curenta este mai mica decat d + c
D[v] = d + c; /// Distanta pana la v devine egala cu d + c
Q.push(Node{v, D[v]}); /// Introduc in heap v, cu distanta D[v].
}
}
}
}
}
int main() {
int i, u, v, c;
in >> n >> m;
for(i = 1; i <= m; i++) {
in >> u >> v >> c;
adjList[u].push_back(Edge{v, c}); /// Veciunul este v, costul muchiei este c.
adjList[v].push_back(Edge{u, c}); /// Vecinul este u, costul muchiei este c. Sari peste pt. graf orientat.
}
dijkstra(1); /// Pornim dijkstra cu sursa 1.
for(i = 2; i <= n; i++) {
out << D[i] << ' ';
}
out << '\n';
return 0;
}
/** Linkuri sumplimentare:
1. priority_queue si ce face - http://www.cplusplus.com/reference/queue/priority_queue/
2. algoritmul lui Dijkstra explicat si pe Wikipedia - https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
Baga codul in Code::Blocks, se va vedea mai bine sintaxa.
*/