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 []
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()