🎓 A1Learner
🔍
0 of 112 lessons completed

DSA Dijkstra's Algorithm

Dijkstra's algorithm is a method that finds the cheapest route from one start node to every node. It settles nodes in rising order of their best known cost.

One relaxation step

Relaxing edge C to B tests the route through C. The candidate 2 plus 1 beats the stored 4.

dist = {"B": 4}
candidate = 2 + 1
if candidate < dist["B"]:
    dist["B"] = candidate
print(dist)

The heap orders by distance then node

Pairs compare on distance first and node second. Equal distances therefore leave in label order.

import heapq
heap = []
heapq.heappush(heap, (5, "D"))
heapq.heappush(heap, (3, "B"))
heapq.heappush(heap, (3, "A"))
print(heapq.heappop(heap))
print(heapq.heappop(heap))

Example

import heapq

graph = {
    "A": [("B", 4), ("C", 2)],
    "B": [("A", 4), ("C", 1), ("D", 5)],
    "C": [("A", 2), ("B", 1), ("D", 8), ("E", 10)],
    "D": [("B", 5), ("C", 8), ("E", 2)],
    "E": [("C", 10), ("D", 2)],
}

def dijkstra(graph, start):
    dist = {node: None for node in graph}
    dist[start] = 0
    heap = [(0, start)]
    settled = []
    relaxations = 0
    pushes = 1
    while heap:
        d, node = heapq.heappop(heap)
        if dist[node] is not None and d > dist[node]:
            continue
        settled.append(node)
        for nxt, w in graph[node]:
            relaxations += 1
            cand = d + w
            if dist[nxt] is None or cand < dist[nxt]:
                dist[nxt] = cand
                heapq.heappush(heap, (cand, nxt))
                pushes += 1
    return dist, settled, relaxations, pushes

dist, settled, relaxations, pushes = dijkstra(graph, "A")
for node in sorted(dist):
    print(node, dist[node])
print("settled order:", settled)
print("relaxations:", relaxations)
print("pushes:", pushes)

Key points

  • Relaxation is testing whether one edge improves a known distance
  • A tentative distance is the best cost found for a node so far
  • A settled node is a node whose cheapest distance is final
  • The heap holds pairs of distance first and node second
  • Equal distances resolve by node label because the heap compares pairs

In this example, the heap settles A first and then C at distance 2. Relaxing through C drops B from 4 to 3. B then settles and opens D at distance 8. D opens E at distance 10, beating the direct edge from C. The settled order and the sorted distance table are both printed. The counts show 14 relaxations and 8 pushes for this map.

Note

Dijkstra needs every edge weight to be zero or positive.

Try it Yourself

Edit the code, then press Run.

Running is simulated · Python Playground

Exercise

In Dijkstra's algorithm, what does one relaxation do?