Practice dijkstra's algorithm
Getting some practice with Python's heapq module (which I'm unsure if I used correctly) to do a priority-first-traversal of a graph: known as Dijkstra's algorithm.
This commit is contained in:
parent
91811236a5
commit
c010e6d6cf
1 changed files with 26 additions and 0 deletions
26
deepmind/dijkstra.py
Normal file
26
deepmind/dijkstra.py
Normal file
|
@ -0,0 +1,26 @@
|
|||
# Doing a practice implementation of Dijkstra's algorithm: a priority-first
|
||||
# search.
|
||||
from heapq import heappush, heappop
|
||||
|
||||
|
||||
class Node(object):
|
||||
def __init__(self, value, children):
|
||||
self.value = value
|
||||
self.children = children
|
||||
|
||||
|
||||
def shortest_path(a, b):
|
||||
"""Return the shortest path from `a` to `b`."""
|
||||
q = []
|
||||
seen = set()
|
||||
heappush((a.value, a, [a]), q)
|
||||
|
||||
while q:
|
||||
d, node, path = heappop(q)
|
||||
if node == b:
|
||||
return path
|
||||
seen.add(node)
|
||||
for child in node.children:
|
||||
if child not in seen:
|
||||
heappush((d + child.value, child, path + [child]), q)
|
||||
raise Exception("Path between nodes A and B does not exist.")
|
Loading…
Reference in a new issue