python有向图带权最短路径_带权图的最短路径算法(Dijkstra)实现

一,介绍

本文实现带权图的最短路径算法。给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度。在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带权的。不带权的Dijkstra算法要简单得多(可参考我的另一篇:无向图的最短路径算法JAVA实现);而对于带权的Dijkstra算法,最关键的是如何“更新邻接点的权值”。本文采用最小堆作为辅助,以重新构造堆的方式实现更新邻接点权值。

对于图而言,存在有向图和无向图。本算法只需要修改一行代码,即可同时实现带权有向图的Dijkstra和带权无向图的Dijkstra。因为,不管图是否是有向的还是无向的,只是构造图的方式不一样而已,而 Dijkstra算法都是一样的。

Dijkstra算法的实现需要一个辅助堆,用来选取当前到源点的距离 最小的那个顶点,这里采用了最小堆来实现。用最小堆保存图中所有顶点到源点的距离,因为Dijkstra算法运行过程中,需要每次选取当前到源点 距离最短 的那个顶点,这步操作用“出堆”很容易实现,但是,当选出该顶点之后, 需要不断地更新该顶点的邻接点到源点的距离。而最小堆不能很好地支持这种更新操作(关于最小堆可参考:),这也是为什么《算法导论》中推荐使用菲波拉契堆或者配对堆实现Dijkstra算法的原因。

二,Dijkstra实现思路

①初始化,源点的距离初始化为0(源点到它自己的距离当然是0了),源点的前驱顶点为null(因为是从源点开始的嘛,求源点到图中所有其他顶点的minDistance...)。所有其他顶点的前驱顶点也初始化为null,且顶点的“距离”(dist)属性初始化为无穷大(Integer.MAX_VALUE),即其他顶点到源点的距离 为无穷大。

②构造堆。将所有的顶点按照“距离”属性(dist) 构造最小堆。显然,由于源点的“距离”属性为0,其他顶点的“距离”属性为Integer.MAX_VALUE,故最开始构造的堆的 堆顶元素为源点。

③只要堆中还存在元素(while循环),执行deleteMin从堆中删除堆顶元素,记该元素为v,寻找v的所有邻接点,更新v的所有邻接点的距离。怎么更新的呢?就是比较:❶v的邻接点到源点的距离(dist属性)   ;  ❷v到源点的距离(dist属性) 加上  v 到v的邻接点的这条 边的权值

v的邻接点的距离(dist属性)取 ❶ ❷ 中较小的那个。

伪代码如下:

DIJKSTRA(G,w,s)

初始化

构造堆(Q=V(G))

while(!isEmpty(Q))

v=EXTRACT-MIN(Q)

foreach vertex v_adj belogns to Adj[v]

更新v的邻接点 v_adj

三,具体代码实现

在讲解具体实现前,先介绍下如何构造图。假设图中的数据存储在文件中,文件的格式如下:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值