【发布时间】:2019-07-27 17:37:20
【问题描述】:
我想在下面的 WORKING AND FINISHED 代码中理解,为什么在更新 pq_update 时,它被写成 pq_update[neighbour][1]。
而不是写 pq_update[neighbour] (我就是这样做的),它似乎没有改变任何东西,所以为什么要包含它?
谢谢
import heapq
def dijkstra(graph, start):
distances = {vertex:float('inf') for vertex in graph}
pq = []
pq_update = {}
distances[start] = 0
for vertex, value in distances.items():
entry = [vertex, value]
heapq.heappush(pq, entry)
pq_update[vertex] = entry
while pq:
getmin = heapq.heappop(pq)[0]
for neighbour, distance_neigh in graph[getmin].items():
dist = distances[getmin] + distance_neigh
if dist < distances[neighbour]:
distances[neighbour] = dist
pq_update[neighbour][1] = dist # THIS LINE !!!
print(distances)
return distances
if __name__ == '__main__':
example_graph = {
'U': {'V': 2, 'W': 5, 'X': 1},
'V': {'U': 2, 'X': 2, 'W': 3},
'W': {'V': 3, 'U': 5, 'X': 3, 'Y': 1, 'Z': 5},
'X': {'U': 1, 'V': 2, 'W': 3, 'Y': 1},
'Y': {'X': 1, 'W': 1, 'Z': 1},
'Z': {'W': 5, 'Y': 1},
}
dijkstra(example_graph, 'X')
【问题讨论】:
-
那段代码对我来说似乎有问题。堆首先按节点名称排序,然后仅按距离排序。但是,如果您将其更改为正确排序,当您修改堆中现有节点的条目时,您可能会破坏堆属性,因此在进行任何更改后确实应该调用
heapify或类似的方法来修复它。跨度>
标签: python dictionary graph