python - 图中的回溯

标签 python recursion graph

在 python 中,我有一个图作为邻接列表演示。 以及从特定点到图中所有其他元素的距离。

graph = {
    1 :[2, 7],
    2 :[1, 3],
    3 :[2, 4, 8],
    4 :[3, 5, 9],
    5 :[4, 6, 9],
    6 :[5, 8, 10],
    7 :[1, 8,10],
    8 :[3, 6, 7, 9],
    9 :[4, 5, 8],
    10:[7, 6]
    }

distance = {1: 1, 2: 0, 3: 0, 4: 1, 5: 2, 6: 2, 7: 2, 8: 1, 9: 2, 10: 3}

如何从元素回溯路径: 例如,如果我尝试从 10 回溯,它应该返回:

[10, 7, 1, 2]
[10, 7, 8, 3]
[10, 6, 8, 3]

我尝试递归地执行此操作

def findprev(graph, distance, el, path = []):
    value = distance[el]
    if value == 0:
        print path
        path = []

    for i in graph[el]:
        if value - 1 == distance[i]:
            path.append(i)
            path = findprev(graph, distance, i, path)
    return path

但显然我失去了一些重要的东西,因为结果是:

[7, 1, 2]
[8, 3]
[6, 8, 3]

任何人都可以帮忙找到错误吗

最佳答案

def findprev(graph, distance, el, path=None):
    if path is None:
        path = [el]
    else:
        path.append(el)
    value = distance[el]
    if value == 0:
        print(path)

    for i in graph[el]:
        if value - 1 == distance[i]:
            findprev(graph, distance, i, path[:])

findprev(graph, distance, 10)

输出:

[10, 7, 1, 2]
[10, 7, 8, 3]
[10, 6, 8, 3]

或者,如果您想返回结果路径:

def findprev(graph, distance, el, path=None):
    if path is None:
        path = [el]
    else:
        path.append(el)
    value = distance[el]
    if value == 0:
        return [path]

    result = []
    for i in graph[el]:
        if value - 1 == distance[i]:
            paths = findprev(graph, distance, i, path[:])
            for p in paths:
                result.append(p)
    return result

关于python - 图中的回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10364297/

相关文章:

graph - 从 Erlang 中的有向循环图中的一个顶点找到所有可能的路径

以星号和双星号开头的 Python 方法/函数参数

c# - 奇怪的 C# 泛型约束

javascript - d3 力导向布局 - 链接距离优先

java - 将一棵树分解为森林

c - UVa 3n+1 情况递归堆栈溢出

python - Django UNIQUE 约束失败

python - Django model on_update=models.CASCADE相关对象引用

python - z3 常量声明

sql - Material list 的递归查询