예제 #1
0
def topo_sort_bfs(g:Graph):
    #建立入度表
    in_degrees = {}
    for v in g:
        if v.id not in in_degrees:
            in_degrees[v.id] = 0
        for nbr in v.getConnections():
            in_degrees[nbr.id] = in_degrees.get(nbr.id,0) + 1
    # print(in_degrees)

    #找起始节点
    queue = []
    for key,value in in_degrees.items():
        if value == 0:
            queue.append(key)
    #拓扑排序
    tuopu = []
    while queue:
        cur_id = queue.pop(0)
        tuopu.append(cur_id)
        for nbr in g.getVertex(cur_id).getConnections():
            in_degrees[nbr.id] = in_degrees.get(nbr.id) - 1
            if in_degrees[nbr.id] == 0:
                queue.append(nbr.id)
    #返回结果
    return tuopu if len(tuopu) == len(g.getVertices()) else []
예제 #2
0
def topo_sort_dfs(g:Graph):
    #找出有入度的节点
    in_nodes = set()
    for v in g:
        for nbr in v.getConnections():
           in_nodes.add(nbr.id)
    #找出起始节点
    start_nodes = []
    for node in g.getVertices():
        if node not in list(in_nodes):
            start_nodes.append(node)
    '''
    对递归版dfs做点改变
    '''
    def dfs(node:Vertex,path=''):
        if not node.getConnections():
            paths.append(path + node.id)
            return
        for nbr in node.getConnections():
            dfs(nbr,path + node.id)
        return

    paths = []
    for node in start_nodes:
        dfs(g.getVertex(node))

    #打印结果
    for str in paths:
        for char in str:
            print(char,end=' ')
        print()