『最短路径』单源无负权值最短路径算法——Dijkstra算法(优先队列优化 + C++实现 + 例题)

本文介绍了Dijkstra算法的原理,即按路径长度递增产生最短路的单源最短路径算法。算法通过不断更新权值最小的点并加入集合S来寻找源点到所有点的最短路径。文章通过图示和步骤详细解析了算法过程,并提供了使用优先队列优化的C++实现模板。同时,还给出了洛谷P3371例题作为应用示例。
摘要由CSDN通过智能技术生成

『算法原理』


最短路径(Shortest Path):一个结点到另一个结点的最小权值和。

Dijkstra算法同时也叫单源最短路算法,其思想是——按路径长度递增的次序产生最短路的算法。

通俗来讲就是,找出从源点开始通过1条边可以到达的点的最小路径,2条边可以到达的点的最小路径,....,n-1条边可以到达的点的最小路径,将权值最小的点加入到集合S中,一直更新到终点位置,找到源点和终点的最小路径,将所有结点都加入到S中,结束算法。和Prim算法十分类似。

算法步骤如下:

a.找到一个源点s,更新源点和其他结点的距离(权值),如果不能直接到达就先赋值为无穷大,将源点加入到集合S。

b.更新从源点出发最多经过1条边就可以到达的点的最小权值,将权值最小的点加入到集合S,最多2条边就可以的点的最小权值,...,最多n-1条边就可以的点的最小权值,将权值最小的点加入到集合S。

c.把所有的结点都加入到集合S中,找到源点和终点的最短路径,结束算法。

【算法图示】

  对于图G:

 a.选择一个源点A,更新A到B,C,D,E的距离,将A加入到集合S中

b(1).更新从源点开始通过1条边就可以到达的点,找到其中的权值最小的点B,更新到各结点的权值,将B加入到集合S中

 b(2).更新从源点开始最多通过2条边就可以到达的点ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值