递归。找到给定起点和最大距离的所有最长路径

时间:2015-07-26 20:33:38

标签: python recursion

给定起点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,第二个和第二个通道。

谢谢。

1 个答案:

答案 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.