其他提示

考虑如下修改和执行脚本:

def find_all_paths(graph, start, end, path=[]):
    path = path + [start]
    print 'adding %d'%start
    if start == end:
        return [path]
    if not graph.has_key(start):
        return []
    paths = []
    for node in graph[start]:
        if node not in path:
            paths.extend(find_all_paths(graph, node, end, path))
    print 'returning ' + str(paths)
    return paths

G = {1:[2,3,4], 2:[1,4], 3:[1,4], 4:[1,2,3]}
find_all_paths(G, 1, 4)

输出:

adding 1
adding 2
adding 4
returning [[1, 2, 4]]
adding 3
adding 4
returning [[1, 3, 4]]
adding 4
returning [[1, 2, 4], [1, 3, 4], [1, 4]]

请注意,第一路径是如何加入3之前返回,并且加入4之前返回第二路径。

是,该算法确实是一个DFS。注意它是如何递归马上遍历各个节点时(进入孩子),而不是广度优先搜索它们基本上将使得可行的节点列表(例如,在深度同级别的一切,又名兄弟姐妹),只有递归时那些不符合您的要求。

scroll top