【发布时间】:2020-10-26 13:37:42
【问题描述】:
我是 python 和算法的新手。我一直在尝试实现拓扑排序算法一段时间,但似乎无法创建一个有效的结构。我制作的函数在 adj 列表中表示的图形上运行。
当我有一个 DFS 时,会自上而下地发现节点,并且已经访问过且未再次处理的节点:
def DFS(location, graph, visited = None):
if visited == None:
visited = [False for i in range(len(graph))]
if visited[location] == True:
return
visited[location] = True
node_visited.append(location)
for node in graph[location]:
DFS(node, graph, visited)
return visited
当我尝试构建拓扑排序算法时,我创建了一个新函数,该函数主要检查要添加到排序列表中的那个节点的“可用性”(即:它的相邻节点是否已经被访问过)
def availability(graph, node):
count = 0
for neighbour in graph[node]:
if neighbour in available_nodes:
count += 1
if count != 0:
return False
return True
但是,我的问题是,一旦我访问了节点路径以到达图表底部,DFS 就不允许我重新访问这些节点。因此,一旦我发现路径的尽头,我所做的任何更新都无法处理。
我的方法可能完全不正确,但我想知道是否有人可以帮助改进我的实现设计,或者解释实现通常是如何完成的。提前致谢。
【问题讨论】:
-
你不能像你那样使用简单的 DFS 进行拓扑排序(你需要一种更微妙的方式来查看你的节点是否被访问过)。我建议你看看this wikipedia page 上描述的算法并实现其中一个。