from pythonds.graphs import PriorityQueue, Graph, Vertex
def dijkstra(aGraph,start):
pq = PriorityQueue()
start.setDistance(0)
pq.buildHeap([(v.getDistance(),v) for v in aGraph])
while not pq.isEmpty():
currentVert = pq.delMin()
for nextVert in currentVert.getConnections():
newDist = currentVert.getDistance() \
+ currentVert.getWeight(nextVert)
if newDist < nextVert.getDistance():
nextVert.setDistance( newDist )
nextVert.setPred(currentVert)
pq.decreaseKey(nextVert,newDist)
让我们使用下面的序列图像作为指导,一次应用 Dijkstra 算法的一个顶点。我们从顶点 u 开始。与 u 相邻的三个顶点是 v,w 和 x。由于到 v,w 和 x 的初始距离都被初始化为 sys.maxint,通过起始节点获得它们的新成本都是它们的直接成本。因此,我们将这三个节点中的每一个成本更新。我们还将每个节点的前导设置为 u,并将每个节点添加到优先级队列。我们使用距离作为优先级队列的键。算法的状态如 Figure 3所示。
在 while 循环的下一次迭代中,我们检查与 x 相邻的顶点。顶点 x 是下一个,因为它具有最低的总成本,因此冒泡到优先级队列的开始。在 x,我们看看它的邻居 u,v,w 和 y。对于每个相邻顶点,我们检查通过 x 到该顶点的距离是否小于先前已知的距离。显然,这是 y 的情况,因为它的距离是 sys.maxint。这不是 u 或 v 的情况,因为它们的距离分别为 0 和 2。然而,我们现在知道,如果我们经过 x 而不是从 u 直接到 w,到 w 的距离更小。既然是这样,我们用新的距离更新 w,并将 w 的前导从 u 更改为 x。有关所有顶点的状态,请参见 Figure 4。
下一步是查看邻近 v 的顶点(参见 Figure 5)。此步骤不会对图形进行任何更改,因此我们继续前进到节点 y。在节点 y(见Figure 6),我们发现到 w 和 z 都更小,因此我们相应地调整距离和前导链接。最后,我们检查节点 w 和 z(参见 Figure 6 和 Figure 8)。但是,没有发现额外的更改,因此优先级队列为空,Dijkstra的算法退出。