所有节点最短路径

时间:2016-07-18 17:37:12

标签: python dijkstra

我是Python的新用户。以下代码用于查找从源节点(例如B到所有其他节点)的最短路径。我有兴趣找到每个节点的最短距离。即,从A到全部,从B到全部,.....从G到全部。有些人可以帮助我,请该怎么做。谢谢。

nodes = ('A', 'B', 'C', 'D', 'E', 'F', 'G')

distances = {

    'B': {'A': 5, 'D': 1, 'G': 2},

    'A': {'B': 5, 'D': 3, 'E': 12, 'F' :5},

    'D': {'B': 1, 'G': 1, 'E': 1, 'A': 3},

    'G': {'B': 2, 'D': 1, 'C': 2},

    'C': {'G': 2, 'E': 1, 'F': 16},

    'E': {'A': 12, 'D': 1, 'C': 1, 'F': 2},

    'F': {'A': 5, 'E': 2, 'C': 16}}

unvisited = {node: None for node in nodes} 

visited = {}

current = 'B'

currentDistance = 0

unvisited[current] = currentDistance


while True:

    for neighbour, distance in distances[current].items():

        if neighbour not in unvisited: continue

        newDistance = currentDistance + distance

        if unvisited[neighbour] is None or unvisited[neighbour] > newDistance:

            unvisited[neighbour] = newDistance

    visited[current] = currentDistance

    del unvisited[current]

    if not unvisited: break

    candidates = [node for node in unvisited.items() if node[1]]

    current, currentDistance = sorted(candidates, key = lambda x: x[1])[0]


print(visited)

1 个答案:

答案 0 :(得分:0)

如果您尝试遍历所有节点,则可以对current的初始值进行循环。这将需要对您的代码进行最少的修改:

nodes = ('A', 'B', 'C', 'D', 'E', 'F', 'G')
distances = {
    'B': {'A': 5, 'D': 1, 'G': 2},
    'A': {'B': 5, 'D': 3, 'E': 12, 'F' :5},
    'D': {'B': 1, 'G': 1, 'E': 1, 'A': 3},
    'G': {'B': 2, 'D': 1, 'C': 2},
    'C': {'G': 2, 'E': 1, 'F': 16},
    'E': {'A': 12, 'D': 1, 'C': 1, 'F': 2},
    'F': {'A': 5, 'E': 2, 'C': 16}}

for start in nodes:
    current = start
    currentDistance = 0
    unvisited = {node: None for node in nodes} 
    visited = {}
    unvisited[current] = currentDistance

    while True:
        for neighbour, distance in distances[current].items():
            if neighbour not in unvisited: continue
            newDistance = currentDistance + distance
            if unvisited[neighbour] is None or unvisited[neighbour] > newDistance:
                unvisited[neighbour] = newDistance
        visited[current] = currentDistance
        del unvisited[current]
        if not unvisited: break
        candidates = [node for node in unvisited.items() if node[1]]
        current, currentDistance = sorted(candidates, key = lambda x: x[1])[0]

    print('-- Shortest distances from %s --' % start)
    print(visited)

基本上,我对start进行了循环,并将初始current设置为start。我还在最后添加了一个打印输出,告诉你显示信息的起始节点。