算法:贝尔曼-福特算法

1.简介

贝尔曼-福特算法(Bellman–Ford algorithm)是一个查找最短路径算法主要优点是支持负权重,但时间复杂度较高,还会有负权环的问题。
如果不需要权重应该使用广度优先或深度优先算法,如果只需要权重没有负权重,应该使用迪杰斯特拉算法,上面三种算法性能都会比贝尔曼-福特算法好很多。

2.图示

从A去D点路线,A->B->C->D

负权环问题

正常情况下A->B->C->D的权重是3,是最近的一条路线。但是如果碰到下面这种情况就会出现回路问题,A->B->C->D时没有问题,下面还会一直D->B->C->D转圈,每转一圈权重就降1出现回路。算法最后需要检查是否出现回路。

3.演示

package mainimport ("fmt""math"
)func main() {graph := make(map[string]map[string]float32)graph["A"] = map[string]float32{"B": 5,"C": 0,}graph["B"] = map[string]float32{"C": -7,}graph["C"] = map[string]float32{"D": 5,}graph["D"] = map[string]float32{}distance, parent := bellmanFord(graph, "A")fmt.Println(distance)fmt.Println(parent)
}func bellmanFord(graph map[string]map[string]float32, source string) (distance map[string]float32, parent map[string]string) {distance = make(map[string]float32)parent = make(map[string]string)// 添加当前点到所有节点权重// 权重为默认类型最大值for fromName := range graph {distance[fromName] = math.MaxFloat32parent[fromName] = ""}// 设置自身到自身的权重distance[source] = 0for i := 0; i < len(graph)-1; i++ {for fromName := range graph {for toName, weight := range graph[fromName] {currentWeight := distance[fromName] + weightif distance[toName] > currentWeight {// 记录最短距离 > 启始到父节点距离 + 父节点到当前子节点距离distance[toName] = currentWeightparent[toName] = fromName}}}}// 负权环检查for fromName := range graph {for toName := range graph[fromName] {if distance[toName] > distance[fromName] + graph[fromName][toName] {return nil, nil}}}return
}

4.参考

  • 贝尔曼-福特算法-维基百科
  • 【算法日记】贝尔曼-福德算法

算法:贝尔曼-福特算法相关推荐

  1. 算法-贝尔曼-福特算法

    算法-贝尔曼-福特算法 注:该文是本博主记录学习之用,没有太多详细的讲解,敬请谅解! 一.简介 贝尔曼-福特算法(Bellman–Ford algorithm )用于计算出起点到各个节点的最短距离,支 ...

  2. JavaScript实现bellmanFord贝尔曼-福特算法(附完整源码)

    JavaScript实现bellmanFord贝尔曼-福特算法 bellmanFord.js完整源代码 bellmanFord.js完整源代码 export default function bell ...

  3. C++实现bellman ford贝尔曼-福特算法(最短路径)(附完整源码)

    C++实现bellman ford贝尔曼-福特算法 实现bellman ford贝尔曼-福特算法的完整源码(定义,实现,main函数测试) 实现bellman ford贝尔曼-福特算法的完整源码(定义 ...

  4. 算法系列——贝尔曼福特算法(Bellman-Ford)

    本系列旨在用简单的人话讲解算法,尽可能避免晦涩的定义,读者可以短时间内理解算法原理及应用细节.我在努力! 本篇文章编程语言为Python,供参考. 贝尔曼福特算法(Bellman-Ford) 典型最短 ...

  5. 贝尔曼-福特算法(Bellman-Ford)最短路径问题

    贝尔曼-福特算法(Bellman-Ford) 一.贝尔曼-福特算法(Bellman-Ford) 二.代码实现 一.贝尔曼-福特算法(Bellman-Ford) 贝尔曼-福特算法与迪科斯彻算法类似,都以 ...

  6. 了解贝尔曼·福特算法

    文章目录 为什么在现实生活中会有负权重的边? 为什么我们要留意负权重? 贝尔曼·福特算法如何工作 贝尔曼·福特伪码 Bellman Ford vs Dijkstra C示例 贝尔曼·福特算法的复杂度 ...

  7. Python实现迪杰斯特拉算法和贝尔曼福特算法求解最短路径

    文章目录 (一).题目 (二).导库 (三).绘制带权无向图 (四).获得最短路径 (四).实现最短路径高亮 (五).完整代码 (六).结果展示 关于Python数据分析在数学建模中的更多相关应用:P ...

  8. Bellman-Ford贝尔曼福特算法实现

    作为一种单源最短路径算法,Bellman-Ford对于有向图和无向图都能适用,它还有一个Dijkstra算法无法具备的特点,那就是对含负权图的最短路径搜索. 每i轮对边的遍历之后,只要不存在负权回路, ...

  9. 算法/最短路径/Bellman-Ford贝尔曼福特算法

    ##问题描述 Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的.这时候,就需要使用其他的 ...

最新文章

  1. 重磅!谷歌面试官亲自分享:Google面试技巧
  2. pepflashplayer32_25_0_0_127.dll: 0x59952C6D is not a valid instance ID.
  3. Spring新注解详解
  4. 修改citrix 默认侦听端口的命令和XML Service端口
  5. java中Class对象详解
  6. MySQL运维知识点_mysql运维必备知识点(转载至其他作者)
  7. Android开发笔记(一百二十五)自定义视频播放器
  8. 一个支持CGI的极简WebServer
  9. imu传感器工作原理_各种传感器工作原理汇总
  10. iOS 录音踩坑之旅
  11. 钢构件建筑材料英国UKCA认证—EN 13381-4
  12. 移动网络广告优化(速度优化篇)
  13. datamap excel插件_Excel地图插件 DataMap
  14. 微观计量经济学实证分析中的问题
  15. 旋转卡(qia)壳 平面最远点对
  16. ArcGIS三大文件格式解析
  17. FileStore omap的实现
  18. MOSFET管驱动电路图
  19. PHP水仙花数程序设计思路,php实现水仙花数示例分享
  20. 直流电机c语言驱动程序,直流电机的控制C语言程序

热门文章

  1. 线性代数 : 矩阵的LU分解(可逆方阵)
  2. JMeter连接mysql数据库,并查找数据
  3. Linux上MySQL驱动安装
  4. chatgpt赋能python:如何使用Python选中一行文本?——一名有10年Python编程经验的工程师
  5. linux Slob内存管理小析
  6. 【dsPIC33】多路ADC同时采样
  7. 银河麒麟V10软件安装—arm+mysql8.0.27
  8. HTML 30 年进化史
  9. 斌哥的 Docker 进阶指南
  10. JVM调优三板斧,快速掌握调优的核心与思路