此代码在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图中的子兄弟概念联系起来来解释代码?感谢。
答案 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。注意当循环遍历各个节点时它是如何立即递归(进入孩子),而不是广度优先搜索,它基本上会生成可行节点的列表(例如,在相同深度级别上的所有内容,也称为兄弟节点)并且仅当那些不符合您的要求时递归。