templates/dijkstra.cpp
compilable
$cat templates/dijkstra
Dijkstra's Algorithm
Shortest path in non-negative weighted graphs using priority queue relaxation in O((V+E) log V).
#dijkstra#shortest-path#priority-queue#graph
Log in to track progress, save custom versions, and organize into collections.Log In
$cat source_code/
cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define sz(x) int(x.size())
template <typename T = int>
struct Dijkstra {
struct Edge {
T v, w;
Edge(T V = 0, T W = 0) : v(V), w(W) {}
bool operator<(const Edge& e) const { return w > e.w; }
};
vector<vector<Edge>> adj;
Dijkstra(int n, int edges, bool indirected = true) {
adj = vector<vector<Edge>>(n + 1);
for (int i = 0, u, v, w; i < edges; i++) {
cin >> u >> v >> w;
adj[u].push_back(Edge(v, w));
if (indirected) adj[v].push_back(Edge(u, w));
}
}
T Min_Cost(int src, int dest) {
int n = sz(adj);
vector<T> dist(n, numeric_limits<T>::max());
dist[src] = 0;
priority_queue<Edge> Dij;
Dij.push(Edge(src, 0));
while (!Dij.empty()) {
auto [u, cost] = Dij.top();
Dij.pop();
for (auto& [v, w] : adj[u]) {
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
Dij.push(Edge(v, dist[v]));
}
}
}
return (dist[dest] == numeric_limits<T>::max() ? -1 : dist[dest]);
}
vector<T> get_dist(int src) {
int n = sz(adj);
vector<T> dist(n, numeric_limits<T>::max());
dist[src] = 0;
priority_queue<Edge> Dij;
Dij.push(Edge(src, 0));
while (!Dij.empty()) {
auto [u, cost] = Dij.top();
Dij.pop();
for (auto& [v, w] : adj[u]) {
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
Dij.push(Edge(v, dist[v]));
}
}
}
return dist;
}
};
void Solve() {
// write your code here
}
int main() {
ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int t = 1;
// cin >> t;
while (t--) Solve();
return 0;
}75 linesutf-8
$cat explanation_notes.md
notes_viewer --renderedmarkdown (math enabled)
Dijkstra — Shortest Path (Non-Negative Weights)
Template Params
T = weight type (default int, use ll for large weights)Constructor
Dijkstra dij(n, edges, indirected = true);
// n = node count (1-indexed), reads edges lines of "u v w" from cin
Methods
Min_Cost(src, dest) — returns T, min cost src→dest, -1 if unreachableget_dist(src) — returns vector, distances from src to all nodesExample
void Solve()
{
int n, e; cin >> n >> e;
Dijkstra dij(n, e, true); // undirected
cout << dij.Min_Cost(1, n) << "\n";
auto dist = dij.get_dist(1);
}
Notes
n is separate from edge count e.Dijkstra dij(n, e, false); Dijkstra dij(n, e, true); Min_Cost returns -1 if unreachable — only works with signed T.edges lines from cin. Don't create multiple objects from the same input.