DFS Traversal
The key to any graph search algorithm is keeping track of the
visited vertex.
Otherwise we can end up in an
infinite cycle.
class Vertex:
def __init__(self, name):
self.value = name
self.adjacent_vertices = []
def add(self, vertex):
self.adjacent_vertices.append(vertex)
if self not in vertex.adjacent_vertices:
vertex.adjacent_vertices.append(self)
return self
a = Vertex('Alice')
b = Vertex('Bob')
c = Vertex('Candy')
d = Vertex('Derek')
e = Vertex('Elaine')
f = Vertex('Fred')
g = Vertex('Gina')
h = Vertex('Helen')
i = Vertex('Irena')
a.add(b).add(c).add(d).add(e)
b.add(f); c.add(h); d.add(e).add(g); e.add(d)
f.add(h)
g.add(i)
h.add(c)
def dfs_traverse(vertex, visited=[]):
visited.append(vertex.value)
for v in vertex.adjacent_vertices:
if v.value in visited:
continue
dfs_traverse(v, visited)
return visited
print([x for x in dfs_traverse(a)])
print([x for x in dfs_traverse(f, visited=[]) ])
Search One
We can actually search for a
particular vertex.
def dfs(vertex, search_value, visited=[]):
if vertex.value == search_value:
return vertex
visited.append(vertex.value)
for v in vertex.adjacent_vertices:
if v.value in visited:
continue
if v.value == search_value:
return v
search_vertex = dfs(v, search_value, visited)
if search_vertex != None:
return search_vertex
return None
print('Helen =', dfs(a, 'Helen'))
print('Derek =', dfs(a, 'Derek'))
print('Unknown =', dfs(a, 'Unknown'))