#!/usr/bin/env python
class Graph(object):
def __init__(self):
# the key is the vertex, the value is the list of adjacent vertices
self.adjacents = {}
self.nedges = 0
def num_vertices(self):
return self.adjacents.keys()
def num_edges(self):
return self.nedges
def add_edge(self, v, w):
if v not in self.adjacents: self.adjacents[v] = []
self.adjacents[v].append(w)
if w not in self.adjacents: self.adjacents[w] = []
self.adjacents[w].append(v)
self.nedges += 1
def adjacent(self, v):
return self.adjacents[v]
class DepthFirstSearch(object):
def __init__(self, graph, start):
self.count = 0
self.markeddict = {}
self.edge_to = {}
self.start = start
self._dfs(graph, start)
def _dfs(self, graph, vertex):
self.markeddict[vertex] = True
self.count += 1
for v in graph.adjacent(vertex):
if not self.marked(v):
self.edge_to[v] = vertex
self._dfs(graph, v)
def marked(self, vertex):
return vertex in self.markeddict
def has_path_to(self, vertex):
return self.marked(vertex)
def path_to(self, vertex):
if not self.has_path_to(vertex): return None
path = []
path.append(vertex)
while vertex != self.start:
vertex = self.edge_to[vertex]
path.append(vertex)
path.reverse()
return path
class BreadthFirstSearch(object):
def __init__(self, graph, start):
self.count = 0
self.markeddict = {}
self.edge_to = {}
self.start = start
self._bfs(graph, start)
def _bfs(self, graph, vertex):
self.markeddict[vertex] = True
self.count += 1
q = []
q.append(vertex)
while q:
key = q.pop(0)
for v in graph.adjacent(key):
if not self.marked(v):
q.append(v)
self.count += 1
self.markeddict[v] = True
self.edge_to[v] = key
def marked(self, vertex):
return vertex in self.markeddict
def has_path_to(self, vertex):
return self.marked(vertex)
def path_to(self, vertex):
if not self.has_path_to(vertex): return None
path = []
path.append(vertex)
while vertex != self.start:
vertex = self.edge_to[vertex]
path.append(vertex)
path.reverse()
return path
if __name__ == "__main__":
# key is the vertex and value is the list of adjacent vertices
graph = Graph()
graph.add_edge("0", "2")
graph.add_edge("3", "5")
graph.add_edge("3", "4")
graph.add_edge("0", "1")
graph.add_edge("1", "2")
graph.add_edge("2", "3")
graph.add_edge("2", "4")
graph.add_edge("0", "5")
dfs = DepthFirstSearch(graph, "0")
assert "0" == "-".join(dfs.path_to("0"))
assert "0-2-1" == "-".join(dfs.path_to("1"))
assert "0-2" == "-".join(dfs.path_to("2"))
assert "0-2-3" == "-".join(dfs.path_to("3"))
assert "0-2-3-4" == "-".join(dfs.path_to("4"))
assert "0-2-3-5" == "-".join(dfs.path_to("5"))
assert 6 == dfs.count
bfs = BreadthFirstSearch(graph, "0")
assert "0" == "-".join(bfs.path_to("0"))
assert "0-1" == "-".join(bfs.path_to("1"))
assert "0-2" == "-".join(bfs.path_to("2"))
assert "0-2-3" == "-".join(bfs.path_to("3"))
assert "0-2-4" == "-".join(bfs.path_to("4"))
assert "0-5" == "-".join(bfs.path_to("5"))
assert 6 == bfs.count
Thursday, May 24, 2012
How to Implement DFS and BFS in Python
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment