about summary refs log tree commit diff
path: root/deepmind/dijkstra.py
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-01-22T11·07+0000
committerWilliam Carroll <wpcarro@gmail.com>2020-01-22T11·07+0000
commitc010e6d6cff1e348645c337b1c63f8d66a6d6859 (patch)
treefb59d0e77c09e75443ec17cb557a572f71f415c5 /deepmind/dijkstra.py
parent91811236a56c6323f469d5baf6eaa4e436658bb8 (diff)
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.
Diffstat (limited to 'deepmind/dijkstra.py')
-rw-r--r--deepmind/dijkstra.py26
1 files changed, 26 insertions, 0 deletions
diff --git a/deepmind/dijkstra.py b/deepmind/dijkstra.py
new file mode 100644
index 000000000000..6975dbe4d1d6
--- /dev/null
+++ b/deepmind/dijkstra.py
@@ -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.")