예제 #1
0
 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
예제 #2
0
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")
예제 #3
0
    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
예제 #4
0
 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