基本思想:
- 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
- 初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是”起点s到该顶点的路径”。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。
- 然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。重复该操作,直到遍历完所有顶点。
代码
代码如下,嵌入到上上一篇论文的图构造里面 Python 图(Graph)数据结构(一):图的构造与遍历(深度优先 DFS 和广度优先 BFS):
def dijkstra(self, v):
if self._valid(v):
vertex_num = self.vertex_num()
dict1 = {}
for i in self.vertices():
dict1[i] = None
stack = [(v, v, 0)]
count = 0
while count < vertex_num and stack:
stack.sort(key=lambda x: x[2], reverse=True)
from_node, to_node, d = stack.pop()
if dict1[to_node]:
continue
dict1[to_node] = (from_node, d)
for node, weight in self.out_edge(to_node):
if not dict1[node]:
stack.append([to_node, node, d + weight])
count += 1
return dict1
else:
raise ValueError('Node not in graph!')