def pathTo(self, v): x = v path = Stack.create() while x != self.s: path.push(x) x = self.edgeTo[x] path.push(self.s) return path.iterate()
def shortestPathTo(self, v): path = Stack.create() x = v while x != self.s: path.push(self.edgeTo[x]) x = self.edgeTo[x].start() return path.iterate()
def __init__(self, G): if isinstance(G, DirectedEdgeWeightedGraph): G = G.to_digraph() self.reversePostOrder = Stack.create() vertex_count = G.vertex_count() self.marked = [False] * vertex_count for v in range(vertex_count): if not self.marked[v]: self.dfs(G, v)
def shortestPathTo(self, v): path = Stack.create() x = v counter = 0 while x != self.s: path.push(self.edgeTo[x]) if self.edgeTo[x] is None: return None x = self.edgeTo[x].start() counter += 1 if counter > self.vertexCount: return None return path.iterate()
def test_push(self): stack = Stack.create() stack.push(10) stack.push(1) print([i for i in stack.iterate()]) self.assertFalse(stack.is_empty()) self.assertEqual(2, stack.size()) self.assertEqual(1, stack.pop()) self.assertFalse(stack.is_empty()) self.assertEqual(1, stack.size()) self.assertEqual(10, stack.pop()) self.assertTrue(stack.is_empty()) for i in range(100): stack.push(i)
def dfs(self, G, v): self.marked[v] = True self.onStack[v] = True for w in G.adj(v): if not self.marked[w]: self.edgeTo[w] = v self.dfs(G, w) elif self.cycle is not None: break elif self.onStack[w]: self.cycle = Stack.create() x = v while x != w: self.cycle.push(x) x = self.edgeTo[x] self.cycle.push(w) self.cycle.push(v) break self.onStack[v] = False
def __init__(self): self.stack = Stack.create()