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!')
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值