|
| 1 | +import heapq |
| 2 | + |
| 3 | +def dijkstra(graph, start): |
| 4 | + # Initialize distances and predecessors |
| 5 | + distances = {vertex: float('infinity') for vertex in graph} |
| 6 | + distances[start] = 0 |
| 7 | + predecessors = {} |
| 8 | + |
| 9 | + # Priority queue to keep track of vertices to visit |
| 10 | + vertices_to_visit = [(0, start)] |
| 11 | + |
| 12 | + while vertices_to_visit: |
| 13 | + current_distance, current_vertex = heapq.heappop(vertices_to_visit) |
| 14 | + |
| 15 | + # If the current distance is larger than the stored distance, skip it |
| 16 | + if current_distance > distances[current_vertex]: |
| 17 | + continue |
| 18 | + |
| 19 | + for neighbor, weight in graph[current_vertex].items(): |
| 20 | + distance = current_distance + weight |
| 21 | + |
| 22 | + if distance < distances[neighbor]: |
| 23 | + distances[neighbor] = distance |
| 24 | + predecessors[neighbor] = current_vertex |
| 25 | + heapq.heappush(vertices_to_visit, (distance, neighbor)) |
| 26 | + |
| 27 | + return distances, predecessors |
| 28 | + |
| 29 | +# Example graph as an adjacency dictionary |
| 30 | +graph = { |
| 31 | + 'A': {'B': 1, 'C': 4}, |
| 32 | + 'B': {'A': 1, 'C': 2, 'D': 5}, |
| 33 | + 'C': {'A': 4, 'B': 2, 'D': 1}, |
| 34 | + 'D': {'B': 5, 'C': 1} |
| 35 | +} |
| 36 | + |
| 37 | +start_vertex = 'A' |
| 38 | +distances, predecessors = dijkstra(graph, start_vertex) |
| 39 | + |
| 40 | +# Print the shortest distances and paths from the start vertex |
| 41 | +for vertex, distance in distances.items(): |
| 42 | + path = [vertex] |
| 43 | + while vertex != start_vertex: |
| 44 | + vertex = predecessors[vertex] |
| 45 | + path.insert(0, vertex) |
| 46 | + print(f'Shortest path to {vertex}: {path}, Distance: {distance}') |
0 commit comments