本文主要讲解求单源最短路径的Bellman-Ford算法。

Bellman-Ford算法

Bellman-Ford算法能够在一般情况下,解决单源最短路径问题。允许图中出现权为负数的边。该算法还会返回一个布尔值。如果布尔值为false,表示途中存在从源点可达的权为负的回路。

首先介绍一下松弛计算。如下图:

松弛计算之前,点B的值是8,但是点A的值加上边上的权重2,得到5,比点B的值(8)小,所以,点B的值减小为5。这个过程的意义是,找到了一条通向B点更短的路线,且该路线是先经过点A,然后通过权重为2的边,到达点B。

当然,如果 出现一下情况

则不会修改点B的值,因为3+4>6。

Bellman-Ford算法可以大致分为三个部分

第一,初始化所有点。每一个点保存一个值,表示从原点到达这个点的距离,将原点的值设为0,其它的点的值设为无穷大(表示不可达)。

第二,进行循环,循环下标为从1到n-1(n等于图中点的个数)。在循环内部,遍历所有的边,进行松弛计算。

第三,遍历途中所有的边(edge(u,v)),判断是否存在这样情况:

d(v) > d (u) + w(u,v)

则返回false,表示途中存在从源点可达的权为负的回路。

之所以需要第三部分的原因,是因为,如果存在从源点可达的权为负的回路。则 应为无法收敛而导致不能求出最短路径。

考虑如下的图:

经过第一次遍历后,点B的值变为5,点C的值变为8,这时,注意权重为-10的边,这条边的存在,导致点A的值变为-2。(8+ -10=-2)

第二次遍历后,点B的值变为3,点C变为6,点A变为-4。正是因为有一条负边在回路中,导致每次遍历后,各个点的值不断变小。

在回过来看一下bellman-ford算法的第三部分,遍历所有边,检查是否存在d(v) > d (u) + w(u,v)。因为第二部分循环的次数是定长的,所以如果存在无法收敛的情况,则肯定能够在第三部分中检查出来。比如

此时,点A的值为-2,点B的值为5,边AB的权重为5,5 > -2 + 5. 检查出来这条边没有收敛。

所以,Bellman-Ford算法可以解决图中有权为负数的边的单源最短路径问。

单源最短路径的Bellman-Ford算法。相关推荐

  1. 单源最小路径BellMan Ford算法

    Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法. 输入:带权图 输出:从第0个点到其他点的最短路径值 B ...

  2. c++ 单源最短路径-狄杰斯特拉算法

    文章目录 源码 输出 狄杰斯特拉算法 适用范围:没有负权重的图, 可以有环,有向无向图均可 求解问题:单源最短路径 时间复杂度:V^2 源码 #include <iostream> #in ...

  3. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法

    Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...

  4. 单源最短路径问题(dijkstra算法)

    一.问题描述 给定一个随机带权有向图,每条边的权是一个实数.另外给定图中一个顶点,称为源.计算源到各顶点的最短路径长度(即距离),要求能随机生成图,随机指定源点计算出到顶点的最短距离. 二.解题思路 ...

  5. 求解单源最短路径的几种算法

    方法一:Dijkstra算法 #include<iostream> #include<algorithm> #include<cstring> #include&l ...

  6. c语言bellman算法,求 最短路径中BELLMAN FORD算法实现的C程序

    匿名用户 1级 2010-06-01 回答 //这个是邻接表 typedef struct oo { int len,num; struct oo *next; } link; typedef str ...

  7. 图算法:2、计算带有负权值的单源最短路径:Bellman-Ford算法

    原文地址:http://www.wutianqi.com/?p=1912 相关文章: 1.Dijkstra算法: http://www.wutianqi.com/?p=1890 2.Floyd算法: ...

  8. C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)

    上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...

  9. 【算法】Dijkstra算法(单源最短路径问题) 邻接矩阵和邻接表实现

    Dijkstra算法可使用的前提:不存在负圈. 负圈:负圈又称负环,就是说一个全部由负权的边组成的环,这样的话不存在最短路,因为每在环中转一圈路径总长就会边小. 算法描述: 1.找到最短距离已确定的顶 ...

  10. 【算法】Bellman-Ford算法(单源最短路径问题)(判断负圈)

    单源最短路问题是固定一个起点,求它到其他所有点的最短路的问题. 算法: 设 d[i] 表示 起点 s 离点 i 的最短距离. 固定起点s,对所有的点 , i = s , d[i] 置为 0 :i != ...

最新文章

  1. 要毁灭人类、喷马斯克、还获得公民身份的Sophia,是假的
  2. SAP HANA插上32路CPU,性能多大飞跃?
  3. NET 2.0中WinForm自定义的程序配置存放到哪里去了
  4. OpenCV级联分类器Cascade Classifier
  5. Matlab第二章选择题填空题,matlab及其在大学物理中的应用第二章习题答案.doc
  6. 宏定义和Typedef区别?
  7. pydebugger
  8. Python-学习-import语句导入模块
  9. embedding亦福亦祸?XGBoost与LightGBM的新机遇
  10. win7台式机系统调节显示屏亮度
  11. php冗余,php – 如何使用规范化删除冗余?
  12. SQL server 2005的备份与还原
  13. 简笔画花边边框超简单_好看的花边边框简笔画
  14. Kali linux 基础常用指令详解
  15. Teaching Machines to Read and Comprehend
  16. 漫游费概念模糊,运营商自食其果
  17. 电脑桌面计算机文件打不开怎么办,电脑开机桌面文件都点不开的解决方法
  18. 华为吹响“伙伴暨开发者”集结号:共赢数字时代
  19. 原码、反码、补码、移码 基本介绍
  20. 预编译及预处理的理解

热门文章

  1. 使用sp_addlinkedserver、sp_dropserver 、sp_addlinkedsrvlogin和sp_droplinkedsrvlogin 远程查询数据...
  2. p_sequencer 再理解
  3. Java学习笔记-枚举类
  4. 测量软件应用系统的聚合复杂度【翻译稿】
  5. ELK pipeline
  6. HTML- 锚点实例
  7. 【7001】n阶法雷序列
  8. 4.1 软件开发生命周期模型
  9. python select网络编程详细介绍
  10. Labview实现字符串加密