Bellman-Ford 最短路径算法
算法证明:http://courses.csail.mit.edu/6.006/spring11/lectures/lec15.pdf
先来看一个这样的图:
这是含有负边权的,如果是用djistra的话将会进行无限次松弛操作。从这里可以看出松弛操作是有一点问题的,如果存在负环,将无止尽的松弛,最短路也就不存在了。还有就是选择不同的遍历顺序对于松弛操作来说是挺重要的。今天就来了解一下聪明的Bellman-Ford算法吧!
Bellman-Ford算法每一轮把边按照一定的顺序,逐条边进行松弛。经过|V|-1轮后,得到的必定是最短路径。
献上松弛操作和Bellman-Ford算法的伪代码:
/*
松弛操作
*/
for v in V:
dist[v] = ∞
dist[s]=
while some edge(u,v) has dist[v]>dist[u]+w(u,v):
pick such an edge(u,v)
relax(u,v):
if dist[v]>dist[u]+w(u,v):
dist[v]=dist[u]+w(u,v) /*
Bellman-Ford
*/
for v in V:
dist[v] = ∞
dist[s]=
for i from to |V|-:
for(u,v)in E:
relax(u,v):
if dist[v]>dist[u]+w(u,v):
dist[v]=dist[u]+w(u,v)
接下来就以上图为例,按照以下顺序处理所有的边:(A,B),(A,C),(B,C),(B,D),(B,E),(E,D),(D,B),(D,C).
然后进行第一次迭代:
最开始dist数组的内容为[0,∞,∞,∞,∞],现在处理(A,B),由于dist[B]=∞,dist[A]+w(A,B)=-1,此时应更新dist[B],即dist为[0,-1,∞,∞,∞]。
同理,按照顺序逐个处理边,将得到以下的dist变化过程:
[0,-1,4,∞,∞] (A,C)
[0,-1,2,∞,∞] (B,C)
[0,-1,2,1,∞] (B,D)
[0,-1,2,1,1] (B,E)
[0,-1,2,-2,1] (E,D)
[0,-1,2,-2,1] (D,B)
[0,-1,2,-2,1] (D,C)
第一轮的最后结果就为上面最后一行,当然了,这个不一定是最优的,因此我们还需要进行下一轮,经过|V-1|次后就一定能求出最短路了。
当然,存在负环是无法得到最短路的,此时只需要在最后进行判断,对每条边都判断以下能不能再进行松弛操作,如果存在可以的边,那就是出现负环了。
Bellman-Ford 最短路径算法的更多相关文章
- 21.boost Ford最短路径算法(效率低)
到某个节点最近距离 最短路径当前节点的父节点 完整代码 #include <iostream> #include <string> #incl ...
- Bellman - Ford 算法解决最短路径问题
Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...
- Bellman—Ford算法思想
---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...
- ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)
两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...
- Johnson 全源最短路径算法
解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E + VlogV),要求权值非负: ...
- Floyd-Warshall 全源最短路径算法
Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,即全源最短路径问题(All-Pairs Shortest Paths Probl ...
- Bellman-Ford 单源最短路径算法
Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法.该算法由 Richard Bellman 和 Leste ...
- poj1860 bellman—ford队列优化 Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22123 Accepted: 799 ...
- uva 558 - Wormholes(Bellman Ford判断负环)
题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...
- 最短路径算法(II)
什么??你问我为什么不在一篇文章写完所有方法?? Hmm…其实我是想的,但是博皮的加载速度再带上文章超长图片超多的话… 可能这辈子都打不开了吧… 上接https://www.cnblogs.com/U ...
随机推荐
- zooland 新开源的RPC项目,希望大家在开发的微服务的时候多一种选择,让微服务开发简单,并且容易上手。
zooland 我叫它动物园地,一个构思很长时间的一个项目.起初只是觉得各种通信框架都封装的很好了,但是就是差些兼容,防错,高可用.同时在使用上,不希望有多余的代码,像普通接口一样使用就可以了. 基于 ...
- Asp.Net_<asp:RadioButtonList
<asp:RadioButtonList runat="server" ID="RadioButtonList1" RepeatDirection ...
- Linux Socket 编程简介
在 TCP/IP 协议中,"IP地址 + TCP或UDP端口号" 可以唯一标识网络通讯中的一个进程,"IP地址+端口号" 就称为 socket.本文以一个简单的 ...
- 我的小游戏上线海外AppStore完整流程心得
1,购买一台Mac或者用VMWare 安装Mac OS流程,笔者使用VMWare. 先安装Mac OS 10.13,教程,成功后不要着急安装vmtools, 首先更新系统至最新版,因为真机测试往往需要 ...
- 以太坊—P2P网络
Chord算法 1.Chord 概念 Chrod算法是P2P中的四大算法之一,是有MIT(麻省理工学院)于2001年提出 . Chord的目的是提供一种能在P2P网络快速定位资源的的算法,Chord并 ...
- bugkuct部分writeup 持续更新
6307 校赛被打击到自闭,决心好好学习. web部分题目. 1.web2 地址 http://123.206.87.240:8002/web2/ 既然是第一个题我们应该采取查看源码的方式进行,右键之 ...
- React Native 'config.h' file not found 问题、 'glog/logging.h' file not found 问题、configure: error: C compiler cannot create executables问题解决过程记录
1.在github 上面 git clone 一个RN 项目代码,npm install (yarn)后,准备运行iOS工程,发现'config.h' file not found ,恶心!!! 百度 ...
- Maven 学习笔记——将普通的Java项目转换成Maven项目(3)
将一个普通的java项目转换成Maven项目并不是一个很大的任务,仅仅只需要下面的几步就能将转换成功.下面我是用一个简单的Selenium测试小demon作为例子来说的. 移调项目中所有关联的Libr ...
- 对象函数的readFileSyc类
对于所有的Syc后缀都是表示同步,默认不加是异步操作.
- 打包spring项目遇到的坑 Unable to locate Spring NamespaceHandler for XML schema ……shcema/context 产生的原因及解决方法
图1 图2 问题原因:导致该问题的原因就是打包的时候,同时将 spring-context 和 spring-aop包提取到了我们的程序应用的包中,在package过程中,这2个依赖包的 XML sc ...