|
| 1 | +"""pseudo-code""" |
| 2 | + |
| 3 | +""" |
| 4 | +DIJKSTRA(graph G, start vertex s,destination vertex d): |
| 5 | +// all nodes initially unexplored |
| 6 | +let H = min heap data structure, initialized with 0 and s [here 0 indicates the distance from start vertex] |
| 7 | +while H is non-empty: |
| 8 | + remove the first node and cost of H, call it U and cost |
| 9 | + if U is not explored |
| 10 | + mark U as explored |
| 11 | + if U is d: |
| 12 | + return cost // total cost from start to destination vertex |
| 13 | + for each edge(U, V): c=cost of edge(u,V) // for V in graph[U] |
| 14 | + if V unexplored: |
| 15 | + next=cost+c |
| 16 | + add next,V to H (at the end) |
| 17 | +""" |
| 18 | +import heapq |
| 19 | + |
| 20 | + |
| 21 | +def dijkstra(graph, start, end): |
| 22 | + heap = [(0, start)] # cost from start node,end node |
| 23 | + visited = [] |
| 24 | + while heap: |
| 25 | + (cost, u) = heapq.heappop(heap) |
| 26 | + if u in visited: |
| 27 | + continue |
| 28 | + visited.append(u) |
| 29 | + if u == end: |
| 30 | + return cost |
| 31 | + for v, c in G[u]: |
| 32 | + if v in visited: |
| 33 | + continue |
| 34 | + next = cost + c |
| 35 | + heapq.heappush(heap, (next, v)) |
| 36 | + return (-1, -1) |
| 37 | + |
| 38 | + |
| 39 | +G = {'A': [['B', 2], ['C', 5]], |
| 40 | + 'B': [['A', 2], ['D', 3], ['E', 1]], |
| 41 | + 'C': [['A', 5], ['F', 3]], |
| 42 | + 'D': [['B', 3]], |
| 43 | + 'E': [['B', 1], ['F', 3]], |
| 44 | + 'F': [['C', 3], ['E', 3]]} |
| 45 | + |
| 46 | +shortDistance = dijkstra(G, 'E', 'C') |
| 47 | +print(shortDistance) |
0 commit comments