Count Paths in Graph
#======================================================================= # Author: Isai Damier # Title: Count Paths in Graph # Project: geekviewpoint # Package: algorithm.graph # # Statement: # Given a directed acyclic graph G, a source vertex s, and # a terminus t count all the paths from s to t? # # Time-complexity: O(E) # where E is the number of edges in the graph. # # Depth First Search: # # All you have to do here is use depth first search (DFS) to traverse # the edges of the graph starting from s and count how many time you # reach e. #======================================================================= class CountPathsInGraph( object ): def __init__( self ): ''' Constructor ''' def paths( self, G, s, e ) : return self.pathsDFS( G, s, e ) def pathsDFS( self, G, s, e ) : counter = 0 for x in self.adjacency( G, s ) : if x == e: counter += 1 else: counter += self.pathsDFS( G, x, e ) return counter def adjacency( self, G, s ) : result = [] for i in range( len( G ) ): if G[s][i] is not None: result.append( i ) return result
import unittest from graph.CountPathsInGraph import CountPathsInGraph class Test( unittest.TestCase ): def testPaths( self ): dfs = CountPathsInGraph() NO = None G = [ [NO, 1, NO, NO, 4, NO, NO, NO, NO, NO, NO], # 0 [NO, NO, 2, NO, NO, NO, NO, NO, NO, NO, NO], # 1 [NO, NO, NO, 3, NO, NO, NO, NO, NO, NO, NO], # 2 [NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO], # 3 [NO, NO, NO, NO, NO, 5, 6, NO, NO, NO, NO], # 4 [NO, NO, 2, NO, NO, NO, NO, NO, NO, NO, NO], # 5 [NO, NO, NO, NO, NO, NO, NO, 7, NO, NO, NO], # 6 [NO, NO, 2, NO, NO, NO, NO, NO, 8, NO, 10], # 7 [NO, NO, NO, 3, NO, NO, NO, NO, NO, NO, NO], # 8 [NO, NO, 2, NO, NO, NO, NO, NO, NO, NO, NO], # 9 [NO, NO, NO, NO, NO, NO, NO, NO, NO, 9, NO] # 10 ] self.assertEquals( 4, dfs.paths( G, 0, 2 ) ) self.assertEquals( 5, dfs.paths( G, 0, 3 ) ) self.assertEquals( 0, dfs.paths( G, 3, 0 ) )