查找图中没有起点或终点的所有路径

时间:2018-09-05 18:59:33

标签: python graph

我正在玩一个游戏,进入到下一个级别,我们必须在每个级别之前击败它。每个级别对应一个特定的字母。

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

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

{
'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'))

但是我的回答没有。

1 个答案:

答案 0 :(得分:0)

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

第二件事是您的词典有误。我假设字典的每个键都是凝视节点,每个值都是可能的末端节点。这就是您的算法当前的工作方式。在这种情况下,将不提供起始A1的结束节点。因此,您将获得None输出。

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