diff --git a/graph/dijkstra.cpp b/graph/dijkstra.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a0c8b1b2ab948548258fe7fa8c89236ad23910d2 --- /dev/null +++ b/graph/dijkstra.cpp @@ -0,0 +1,39 @@ +/** + * Dijkstra + * Complexity (Time): O(|E| + |V| log |V|) + * Complexity (Space): O(|E| + |V|) + */ + +int dist[MAX]; +vector<ii> graph[MAX]; + +// Get shortest distance from o to d +int dijkstra(int o, int d) { + set<ii> pq; + int u, v, wt; + + memset(dist, inf, sizeof dist); + + dist[o] = 0; + pq.insert(make_pair(0, o)); + + while (pq.size() != 0) { + u = pq.begin()->second; + pq.erase(pq.begin()); + + for (auto i : graph[u]) { + v = i.first; + wt = i.second; + + if (dist[v] > dist[u] + wt) { + if (dist[v] != oo) + pq.erase(pq.find(make_pair(dist[v], v))); + + dist[v] = dist[u] + wt; + pq.insert(make_pair(dist[v], v)); + } + } + } + + return dist[d]; +}