这个python代码是否采用深度优先搜索(DFS)来查找所有路径?

时间:2010-11-20 02:23:15

标签: python graph-theory depth-first-search

此代码在python official essays on graph theory中给出。这是代码:

def find_all_paths(graph, start, end, path=[]):
        path = path + [start]
        if start == end:
            return [path]
        if not graph.has_key(start):
            return []
        paths = []
        for node in graph[start]:
            if node not in path:
                newpaths = find_all_paths(graph, node, end, path)
                for newpath in newpaths:
                    paths.append(newpath)
        return paths

我不擅长python,因为我还没有足够的练习和阅读。您能否通过将其与DFS图中的子兄弟概念联系起来来解释代码?感谢。

3 个答案:

答案 0 :(得分:4)

看到它是DFS的关键是递归发生在路径累积之前。换句话说,在将任何内容放在“路径”列表之前,递归将尽可能深入。在返回列表之前,所有最深的兄弟姐妹都会积累在“路径”上。

我认为代码与“append”而不是“extend”是正确的,因为“paths”是所有路径的累加器。虽然它可能写成

paths += find_all_paths(graph, node, end, path)

(编辑)...而不是

 newpaths = find_all_paths(graph, node, end, path)
 for newpath in newpaths:
     paths.append(newpath)

答案 1 :(得分:3)

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

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之前返回第二个路径。

答案 2 :(得分:1)

是的,这个算法确实是一个DFS。注意当循环遍历各个节点时它是如何立即递归(进入孩子),而不是广度优先搜索,它基本上会生成可行节点的列表(例如,在相同深度级别上的所有内容,也称为兄弟节点)并且仅当那些不符合您的要求时递归。