#include #include #include #include #include using namespace std; typedef pair pii; typedef vector > Graph; void dijkstra(Graph &g, int s, vector &prio, vector &pred) { int n = g.size(); prio.assign(n, INT_MAX); prio[s] = 0; pred.assign(n, -1); priority_queue , greater > q; q.push(make_pair(prio[s], s)); while (!q.empty()) { int d = q.top().first; int u = q.top().second; q.pop(); if (d != prio[u]) continue; for (int i = 0; i < (int) g[u].size(); i++) { int v = g[u][i].first; int nprio = prio[u] + g[u][i].second; if (prio[v] > nprio) { prio[v] = nprio; pred[v] = u; q.push(make_pair(nprio, v)); } } } } void dijkstra2(Graph &g, int s, vector &prio, vector &pred) { int n = g.size(); prio.assign(n, INT_MAX); prio[s] = 0; pred.assign(n, -1); set q; q.insert(make_pair(prio[s], s)); while (!q.empty()) { int u = q.begin()->second; q.erase(q.begin()); for (int i = 0; i < (int) g[u].size(); ++i) { int v = g[u][i].first; int nprio = prio[u] + g[u][i].second; if (prio[v] > nprio) { q.erase(make_pair(prio[v], v)); prio[v] = nprio; pred[v] = u; q.insert(make_pair(prio[v], v)); } } } } int main() { Graph g(3); g[0].push_back(make_pair(1, 10)); g[1].push_back(make_pair(2, -5)); g[0].push_back(make_pair(2, 8)); vector prio; vector pred; dijkstra(g, 0, prio, pred); for (int i = 0; i < prio.size(); i++) cout << prio[i] << endl; }