【问题标题】:Depth first search - returned path from one vertex of a graph to another includes unnecessary vertices深度优先搜索 - 从图的一个顶点到另一个顶点的返回路径包括不必要的顶点
【发布时间】: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


【解决方案1】:

有很多方法可以解决这个问题。一方面,您可以运行 BFS 而不是 DFS,或者您可以使用不相交联合集 (DSU) 执行一些“手波”操作,以查找图中两个顶点之间的路径。

【讨论】:

  • 我不知道如何使用广度优先搜索或不相交的联合集。即便如此,我的目标是使用深度优先搜索来解决这个问题。不管怎样,谢谢你的建议。我一定会查找广度优先搜索和 DSU。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2014-01-11
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
相关资源
最近更新 更多