12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- class GraphSearch:
- """Graph search emulation in python, from source http://www.python.org/doc/essays/graphs/"""
-
- def __init__(self, graph):
- self.graph = graph
-
- def find_path(self, start, end, path=[]):
- self.start = start
- self.end = end
- self.path = path
-
- self.path+=[self.start]
- if self.start == self.end:
- return self.path
- if not self.graph.has_key(self.start):
- return None
- for node in self.graph[self.start]:
- if node not in self.path:
- newpath = self.find_path(node, self.end, self.path)
- if newpath:
- return newpath
- return None
-
- def find_all_path(self, start, end, path=[]):
- self.start = start
- self.end = end
- self.path = path
- self.path+=[self.start]
- if self.start == self.end:
- return [self.path]
- if not self.graph.has_key(self.start):
- return []
- paths=[]
- for node in self.graph[self.start]:
- if node not in self.path:
- newpaths = self.find_all_path(node, self.end, self.path)
- for newpath in newpaths:
- paths.append(newpath)
- return paths
-
- def find_shortest_path(self, start, end, path=[]):
- self.start = start
- self.end = end
- self.path = path
-
- self.path+=[self.start]
- if self.start == self.end:
- return self.path
- if not self.graph.has_key(self.start):
- return None
- shortest = None
- for node in self.graph[self.start]:
- if node not in self.path:
- newpath = self.find_shortest_path(node, self.end, self.path)
- if newpath:
- if not shortest or len(newpath) < len(shortest):
- shortest = newpath
- return shortest
- #example of graph usage
- graph = {'A':['B', 'C'],
- 'B': ['C', 'D'],
- 'C': ['D'],
- 'D': ['C'],
- 'E': ['F'],
- 'F': ['C']
- }
- #inistialization of new graph search object
- graph1 = GraphSearch(graph)
- print graph1.find_path('A', 'D')
- print graph1.find_all_path('A', 'D')
- print graph1.find_shortest_path('A', 'D')
|