Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
oorrja
GitHub Repository: oorrja/learntosolveit
Path: blob/master/languages/python/algorithm_traversal.py
1240 views
1
from collections import deque
2
3
4
def bfs(g, start):
5
queue, enqueued = deque([(None, start)]), set([start])
6
while queue:
7
parent, n = queue.popleft()
8
yield parent, n
9
new = set(g[n]) - enqueued
10
enqueued |= new
11
queue.extend([(n, child) for child in new])
12
13
def dfs(g, start):
14
stack, enqueued = [(None, start)], set([start])
15
while stack:
16
parent, n = stack.pop()
17
yield parent, n
18
new = set(g[n]) - enqueued
19
enqueued |= new
20
stack.extend([(n, child) for child in new])
21
22
def shortest_path(g, start, end):
23
parents = {}
24
for parent, child in bfs(g, start):
25
parents[child] = parent
26
if child == end:
27
revpath = [end]
28
while True:
29
parent = parents[child]
30
revpath.append(parent)
31
if parent == start:
32
break
33
child = parent
34
return list(reversed(revpath))
35
return None # or raise appropriate exception
36
37
if __name__ == '__main__':
38
# a sample graph
39
graph = {'A': ['B', 'C','E'],
40
'B': ['A','C', 'D'],
41
'C': ['D'],
42
'D': ['C'],
43
'E': ['F', 'D'],
44
'F': ['C']}
45
46
for node in bfs(graph,'A'):
47
print(node)
48
49