def mDFS(graph: DirectedGraph) -> List[Node]: stack = [] visited = set() for node in graph.getAllNodes(): if node not in visited: TopSort.mDFSHelper(graph, node, stack, visited) stack.reverse() return stack
def printGraph(graph: DirectedGraph): if verbose: print("Start to Print Graph") nodes = graph.getAllNodes() for node in nodes: print("--- Node", node.getNodeVal(), "---") for neighbor in node.getNeighbors(): print("Neighbor -", neighbor.getNodeVal(), "Weight -", node.getNeighbors()[neighbor]) print("Done Printing Graph")
def createRandomDAGIter(n): graph = DirectedGraph() nums = list(range(n)) for num in nums: graph.addNode(num) for node in graph.getAllNodes(): numNodes = random.randint(0, n - node) numsAdded = set() while len(numsAdded) != numNodes: num = random.randint(node + 1, n) if num not in numsAdded: numsAdded.add(num) graph.addDirectedEdge(node, num) return graph
def Kahns(graph: DirectedGraph) -> List[Node]: nodes = graph.getAllNodes() inDegreeMap = {node:0 for node in nodes} for node in nodes: for neighbor in node.getNeighbors(): inDegreeMap[neighbor] += 1 topSort = [] queue = deque() for node in inDegreeMap: if inDegreeMap[node] == 0: queue.append(node) count = 0 while len(queue) != 0: node = queue.popleft() topSort.append(node) count += 1 for neighbor in node.getNeighbors(): inDegreeMap[neighbor] -= 1 if inDegreeMap[neighbor] == 0: queue.append(neighbor) if count != len(graph.nodes): return None return topSort