给定起点A和最大距离D,从A开始的最长路径是什么,其长度大于或等于D.这段代码有什么问题?
def find_paths(graph, start, path, allpaths, dmax):
if dmax == 0:
allpaths.append([start])
else:
path.append(start)
for edge in graph[start]:
d = graph[start][edge]
if dmax - d >= 0:
find_paths(graph, edge, path, allpaths, dmax - d)
else:
allpaths.append(path)
return allpaths
graph = {
1: {2: 33, 3: 15},
2: {1: 33, 4: 57, 5: 7},
3: {1: 15},
4: {2: 57},
5: {1: 89, 2: 7},
}
print find_paths(graph, 1, [], [], 50)
这给出了:
[[1, 2, 5, 2, 3, 1, 3], [1, 2, 5, 2, 3, 1, 3], [1, 2, 5, 2, 3, 1, 3], [1, 2, 5, 2, 3, 1, 3], [1, 2, 5, 2, 3, 1, 3], [1, 2, 5, 2, 3, 1, 3], [1, 2, 5, 2, 3, 1, 3], [1, 2, 5, 2, 3, 1, 3]]
find_paths(graph, 1, [], [], 50)
的输出应该是(1,3)和(1,2,5)。也就是说,第一个通过顶点1和3的路径,第二个通过顶点1和3,第二个和第二个通道。
谢谢。
答案 0 :(得分:1)
一个大问题是你要追加到路径,然后将它传递给递归的下一次迭代。这就是为什么你为每条路径获得相同结果的原因。您需要每次都创建一个新路径。
def find_paths(graph, start, path, allpaths, dmax):
if dmax == 0:
allpaths.append([start])
else:
newpath = path + [start]
for edge in graph[start]:
d = graph[start][edge]
if dmax - d >= 0:
find_paths(graph, edge, newpath, allpaths, dmax - d)
else:
allpaths.append(newpath + [edge])
return allpaths
graph = {
1: {2: 33, 3: 15},
2: {1: 33, 4: 57, 5: 7},
3: {1: 15},
4: {2: 57},
5: {1: 89, 2: 7},
}
print find_paths(graph, 1, [], [], 50)
此外,我不确定您为什么期望结果为(1,3)和(1,2,5)。在我看来,(1,3)的长度为15.