graph = {
0: {1: 4, 2: 1},
1: {3: 1},
2: {1: 2, 3: 5},
3: {}
}
import heapq
def dijkstra(graph, start):
distances = {node: float('inf') for node in graph}
distances[start] = 0
heap = [(0, start)]
while heap:
current_distance, current_node = heapq.heappop(heap)
if current_distance > distances[current_node]:
continue
for neighbor, weight in graph[current_node].items():
distance = current_distance + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(heap, (distance, neighbor))
return distances
result = dijkstra(graph, 0)
print(result)Starting from node 0, the shortest path to node 1 is via node 2 with total weight 3 (1 + 2). Node 3 is reached via node 1 with total weight 4.
Dijkstra's algorithm finalizes the shortest distance to a node when it is first popped from the priority queue. Negative edges can later reduce this distance, breaking this assumption.
graph = {
0: {1: 7, 2: 9, 5: 14},
1: {0: 7, 2: 10, 3: 15},
2: {0: 9, 1: 10, 3: 11, 5: 2},
3: {1: 15, 2: 11, 4: 6},
4: {3: 6, 5: 9},
5: {0: 14, 2: 2, 4: 9}
}
def dijkstra(graph, start):
distances = {node: float('inf') for node in graph}
distances[start] = 0
visited = set()
while len(visited) < len(graph):
min_node = None
for node in graph:
if node not in visited:
if min_node is None or distances[node] < distances[min_node]:
min_node = node
for neighbor, weight in graph[min_node].items():
if distances[min_node] + weight < distances[neighbor]:
distances[neighbor] = distances[min_node] + weight
visited.add(min_node)
return distances
print(dijkstra(graph, 0))If all unvisited nodes have distance infinity, min_node remains None. Accessing graph[min_node] causes KeyError.
graph = {
0: {1: 2, 2: 4},
1: {2: 1, 3: 7},
2: {3: 3},
3: {4: 1},
4: {}
}
import heapq
def dijkstra(graph, start):
distances = {node: float('inf') for node in graph}
distances[start] = 0
heap = [(0, start)]
while heap:
current_distance, current_node = heapq.heappop(heap)
if current_distance > distances[current_node]:
continue
for neighbor, weight in graph[current_node].items():
distance = current_distance + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(heap, (distance, neighbor))
return distances
result = dijkstra(graph, 0)
count = sum(1 for dist in result.values() if dist <= 5)
print(count)Distances: 0->0=0, 0->1=2, 0->2=3 (via 1), 0->3=6 (via 2), 0->4=7 (via 3). Nodes with distance ≤5 are 0,1,2. Node 3 is 6, so excluded.
graph = {
'A': {'B': 1, 'C': 4},
'B': {'C': 2, 'D': 5},
'C': {'D': 1},
'D': {}
}
import heapq
def dijkstra(graph, start):
distances = {node: float('inf') for node in graph}
distances[start] = 0
heap = [(0, start)]
while heap:
current_distance, current_node = heapq.heappop(heap)
if current_distance > distances[current_node]:
continue
for neighbor, weight in graph[current_node].items():
distance = current_distance + weight
if distance < distances[neighbor]:
distances[neighbor] = distance
heapq.heappush(heap, (distance, neighbor))
return distances
result = dijkstra(graph, 'A')
print(result)Shortest path A->B=1, A->B->C=3, A->B->C->D=4 is shorter than A->C->D=5 or A->B->D=6.
