Python Dijkstra shortest paths
Dijkstra's algorithm repeatedly processes the smallest tentative distance. Relaxing an edge means replacing a distance when a cheaper route is found.
Python
import heapq
def shortest_paths(graph, start):
distances = {start: 0}
heap = [(0, start)]
while heap:
distance, node = heapq.heappop(heap)
if distance != distances[node]:
continue
for neighbor, weight in graph.get(node, []):
if weight < 0:
raise ValueError("nonnegative weights required")
candidate = distance + weight
if candidate < distances.get(neighbor, float("inf")):
distances[neighbor] = candidate
heapq.heappush(heap, (candidate, neighbor))
return distances
graph = {"A": [("B", 4), ("C", 1)], "C": [("B", 2)], "B": []}
result = shortest_paths(graph, "A")
print(sorted(result.items()))
assert shortest_paths({}, "A") == {"A": 0}