在两个节点之间查找节点

时间:2014-02-27 20:40:36

标签: python

我在python中编写了dijkstras算法,并为输入G获得以下输出:

G={'A': {('B', 1.0), ('C', 5.0)},
   'B': {('D', 2.0), ('E', 4.0), ('A', 1.0)},
   'C': {('A', 5.0), ('E', 3.0), ('D', 2.0)},
   'D': {('E', 1.0), ('C', 2.0), ('B', 2.0)},
   'E': {('D', 1.0), ('B', 4.0), ('C', 3.0)}}

,即A和B之间的距离为1.0,A和C为5.0,依此类推 shortestPath(G,"A")给了我:

Output: {'E': 4.0, 'D': 3.0, 'A': 0, 'C': 5.0, 'B': 1.0}

现在我应该使用此输出来查找两个节点之间的所有节点,例如:shortestPathnew(G,"A","C")

在该示例中,A和C之间的最短路径是5.0,并且它经过A-> B-> D-> C.所以输出应该是(5.0,[A,B,D,C])使用基本for循环而不使用.iterations,.keys,yield,sort等内置函数。我被困在这一部分,任何帮助都会有所帮助。

我尝试在线使用示例代码,但我无法根据我的要求修改它:

def shortestPathnew(G,start,end):
    """
    Find a single shortest path from the given start node
    to the given end node.  The output is a list of the node in order along the shortest path."""

    final_distances,predecessors = ShortestPath(graph,start)
    path = []
    while 1:
        path.append(end)
        if end == start: break
        end = predecessors[end]
    path.reverse()
    return path

我必须在不使用.append,.reverse

的情况下实现它

1 个答案:

答案 0 :(得分:1)

根据示例代码,我不能认为您的shortestPath方法和示例代码使用的方法返回相同的内容。我猜它正在回归:

({'E': 4.0, 'D': 3.0, 'A': 0, 'C': 5.0, 'B': 1.0}, {'B': 'A', 'D': 'B', 'C': 'A', 'E':'D', 'A': None})

因此它不仅具有最终距离,还包括每个节点及其前面的节点(我不知道它是否包括起始节点)。

如果您可以在shortestPath方法中生成该方法,那么将示例代码更改为仅使用基本for循环应该不会太难。这是一种可能性:

final_distances,predecessors = ShortestPath(graph,start)
path = end
while end != start:
    end = predecessors[end]
    path = '%s->%s' % (end, path)
return path

不是将结果存储在列表中并将每个新节点附加到该列表的末尾,而是每次创建一个前置字符串的字符串。您可以使用列表执行类似操作,如果这是您需要返回的内容:

final_distances,predecessors = ShortestPath(graph,start)
path = [end]
while end != start:
    end = predecessors[end]
    path = [end] + path
return path

这里我将路径初始化为仅包含end的列表,并且在循环的每个步骤中,它找到当前节点的前任并将其预先添加到路径。