【发布时间】:2021-03-01 18:36:22
【问题描述】:
在 Kent D. Lee 的教科书 Data Structures and Algorithms with Python 中,使用深度优先搜索存在问题。根据这本书,我必须:
编写一个程序,在图 7.9 所示的图中找到顶点 9 和 29 之间的路径。一定要打印出两个顶点之间的路径中必须经过的路径(即顶点序列)。
代码如下:
def graphDFS(G, start, goal):
def adjacent(current, edges):
adj_list = []
for e in edges:
if current == e[0]:
adj_list.append(e[1])
return adj_list
stack = []
visited = set()
path = []
stack.append(start)
while not len(stack) == 0:
current = stack.pop()
visited.add(current)
path.append(current)
if current == goal:
return path
# return True # or return path to goal perhaps
for v in adjacent(current, G[1]):
if v not in visited:
stack.append(v)
return []
这里给出了有向图图像的链接:(See Fig. 9 for the graph)
我目前拥有的路径是[9, 3, 2, 8, 13, 16, 17, 6, 24, 27, 29]。但是,当我最后检查我的结果时,除了那个 6 之外,整个路径都很好。我的猜测是它与使用的堆栈有关。有人知道我的代码有什么问题吗?
谢谢! :D
【问题讨论】:
-
你到底想要什么?
-
对不起。我只是在寻找一种将正确路径存储在变量(例如列表)中的方法。例如,如果我们必须从 9 到 28 到 27 到 29 遍历,那么我希望能够以某种方式跟踪这条路径并最终将其打印为 [28, 27]。
-
然后将当前顶点(使用 dfs)存储在单独的列表中,直到找到目标顶点。就是这样
-
问题在于,它没有像我想要的那样给我 [28, 27],而是给了我类似 [18, 25, 28, 29, 20, 27] 的东西。那么我怎样才能存储正确的而不是没有指向目标的呢?
-
使用全局标志。假设 DFS 遇到起始顶点,然后将其设置为 true。现在您应该仅在标志为
true时存储当前顶点。一旦你遇到目标节点,你可以将标志设置为false并继续整个图搜索,否则你甚至可以直接返回你想要的东西。好吧,我的 Python 很糟糕,如果语言不受限制,我会很好地回答。
标签: python data-structures graph depth-first-search