def __init__(self, G):
     super(Topological, self).__init__()
     cyclefinder = DirectedCycle(G)
     if not cyclefinder.has_cycle():
         dfo = DepthFirstOrder(G)
         self.order = dfo.get_reversePost()
     else:
         self.order = []
Beispiel #2
0
 def __init__(self, G):
     self.orders = []
     cyclefinder = DirectedCycle(G)
     if not cyclefinder.hasCycle():
         dfs = DepthFirstOrder(G)
         self.orders = dfs.reversePost()
     else:
         print("G hasCycle:", end=' ')
         print(cyclefinder.cycle())
Beispiel #3
0
 def __init__(self, G):
     self.counts = 0
     self.markeds = [False] * G.V()
     self.ids = [0] * G.V()
     order = DepthFirstOrder(G.reverse())
     for s in order.reversePost():
         if not self.markeds[s]:
             self.dfs(G, s)
             self.counts += 1
Beispiel #4
0
 def __init__(self, G):
     self.orders = []
     cyclefinder = DirectedCycle(G)
     if not cyclefinder.hasCycle():
         dfs = DepthFirstOrder(G)
         self.orders = dfs.reversePost()
     else:
         print("G hasCycle:", end=' ')
         print(cyclefinder.cycle())
Beispiel #5
0
 def __init__(self, G):
     self.counts = 0
     self.markeds = [False]*G.V()
     self.ids = [0]*G.V()
     order = DepthFirstOrder(G.reverse())
     for s in order.reversePost():
         if not self.markeds[s]:
             self.dfs(G, s)
             self.counts += 1
 def __init__(self, G):
     super(KosarajuSCC, self).__init__()
     self.marked = [0 for i in xrange(G.Vcount())]
     self.id = [-1 for i in xrange(G.Vcount())]
     self.count = 0
     order = DepthFirstOrder(G.reverse())
     for s in order.get_reversePost()[::-1]:  # pop the reverse post stack
         if not self.marked[s]:
             self.dfs(G, s)
             self.count += 1
Beispiel #7
0
    def __init__(self, G):
        finder = DirectedCycle(G)

        if finder.has_cycle() is False:
            dfo = DepthFirstOrder(G)
            self.__order = dfo.reverse_post()
            self.__rank = [0] * G.V()
            for index, v in enumerate(self.__order):
                self.__rank[v] = index
        else:
            self.__order = None
	def __init__(self, G):
		# count is the number of connected coponents in the digraph
		self._depth_first_order = DepthFirstOrder(G.reverse())
		self._count = 0
		self._marked = [False] * G.V()
		self._id = [0] * G.V()
		# size of each component
		self._size = [0] * G.V()
		for v in self._depth_first_order.reverse_postorder():
			if not self._marked[v]:
				self._dfs(G, v)
				self._count += 1
Beispiel #9
0
def topological_order(sg):
    graph = sg.graph()
    finder = DirectedCycle(graph)
    if finder.has_cycle():
        yield 'has_cycle'
        return
    dfs = DepthFirstOrder(graph)
    for v in dfs.reverse_post:
        yield (sg.name(v))
class SCC:
	# contructor takes in a digraph G
	def __init__(self, G):
		# count is the number of connected coponents in the digraph
		self._depth_first_order = DepthFirstOrder(G.reverse())
		self._count = 0
		self._marked = [False] * G.V()
		self._id = [0] * G.V()
		# size of each component
		self._size = [0] * G.V()
		for v in self._depth_first_order.reverse_postorder():
			if not self._marked[v]:
				self._dfs(G, v)
				self._count += 1

	# performs DFS for the graph on v
	def _dfs(self, G, v):
		self._marked[v] = True
		self._id[v] = self._count
		self._size[self._count] = self._size[self._count] + 1
		for w in G.adj(v):
			if not self._marked[w]:
				self._dfs(G, w)


	#  returns a boolean indicating if v, w are connected
	def connected(self, v, w):
		return self._id[v] == self._id[w]

	# returns the number of connected components
	def count(self):
		return self._count

	# component identifier for v
	def id(self, v):
		return self._id[v]