Python 图(Graph)数据结构(三):最短路径 —— 迪杰斯特拉算法(dijkstra)

基本思想:

  1. 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算)。此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
  2. 初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是”起点s到该顶点的路径”。然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。
  3. 然后,再从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!')

你可能感兴趣的:(Python,python,图,最短路径,迪杰斯特拉,dijkstra)