【问题标题】:find all paths in graph without start or end node查找图中没有开始或结束节点的所有路径
【发布时间】:2018-09-05 18:59:32
【问题描述】:

我正在玩一个游戏,要进入下一个关卡,我们必须先击败每个关卡。每个级别对应一个特定的字母。

我已将其表示为图遍历问题,但我试图在没有开始或结束节点的图中查找所有路径。

我的图表表示为字典,键是字符串,值是字符串列表。

{
'A2': ['A1', 'B'], 
'A1': [], 
'B': [], 
'C': ['A2'],
 }

要进入A2级,我们必须完成A1和B。

例如,示例路径是 A1、B、A2、C。 另一条路径可能是 B、A1、A2、C。

深度优先搜索或广度优先搜索的实现需要一个起始节点。我认为一个好的起始节点将是任何值为空的键:在本例中为 A1 和 B,但我不确定如何使用两个起始节点实现 dfs 或 bfs。

我一直在调整查找路径的实现,但这仅适用于开始级别和结束级别。

def find_path(graph, start, end, path=[]):
        path = path + [start]
        if start == end:
            return path
        if start not in graph:
            return None
        for node in graph[start]:
            if node not in path:
                newpath = find_path(graph, node, end, path)
                if newpath: return newpath
        return None

print(find_path(course_dict, 'A1', 'PC'))

但我的答案没有得到。

【问题讨论】:

  • 与使用 NetworkXigraph 之类的图库相比,您编写自己的图遍历算法是否有原因?
  • 只是用python练习。
  • 这是作业题吗?
  • but I'm trying to find all paths in a graph without a start or end node。查看所有将您带到最终关卡的路径会不会更有意义?

标签: python graph


【解决方案1】:

好的,有两个问题。 首先,您尝试构建一个递归算法,但您仍然使用 for 循环。这很令人困惑,你可以在没有 for 循环的情况下做到这一点。在递归算法中使用循环并没有错,但是如果您更改数据结构,则不需要。

第二件事是你的字典错了。我假设字典的每个键都是起始节点,每个值都是可能的结束节点。这就是您的算法当前的工作方式。在这种情况下,您的开始A1 的结束节点没有给出。因此,您会得到 None 输出。

最大的问题是你使用了错误的算法。该算法会找到从您的起点到终点节点的方法。但是您要确保开始和结束节点之间的每个节点都至少被访问过一次。因此,您可以更改算法(这很容易)或数据结构(这将导致很多变化)。

【讨论】:

  • 我想我的问题是如何修改上述算法使得不需要端节点?
  • 基本上你使用了错误的算法。该算法只确保有一条从头到尾的路。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多