图解Dijkstra和Bellman-Ford的流程以及证明

说到寻路,在游戏里面应用最多的自然还是A寻路,但是这篇文章不讨论A寻路,主要是介绍Dijkstra和Bellman-Ford,因为这两个寻路核心代码少,但是正确性却不容易直接看出来,网上的博客也基本都是画步骤告诉大家怎么做,本文画一画其步骤,并且尝试用比较通俗易懂的话来证明其正确性。

Dijkstra

用于有向图的寻路,可以求出起点到图中任意点的最短路径。
递归n-1次,每次确定一个顶点的距离,依次遍历完所有顶点即完成寻路。
在这里插入图片描述

算法流程

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

证明

由于我们每次确定终点到一个点的最短路径,所以只要确定n-1次中每次确定的正确性即可得证。
在这里插入图片描述

缺陷:负权边在未来存在变小可能

在这里插入图片描述

Bellman-Ford

同样用于有向图的寻路,算法复杂度高于Dijkstra,但是适用于有向图可能存在负权边的时候。其舍弃了Dijkstra贪心的思路,用遍历所有可能路径的办法解决了这个问题。

过程

在这里插入图片描述
设一共n个点,m条边,则进行两次循环,外层循环n-1次,内层循环m次,
每次遍历所有的边,通过到边的起点的距离和边本身的距离,尝试对边的终点的距离进行更新,核心代码很简单,这里可以直接写一下,
大家跟着上图按照代码模拟就行,这里就不继续一步一步做了,比较多。

for i = 0; i < nodes.length - 1; i++ {for j = 0; j < edges.length ; j++ {int start = edges[j].start, end = edges[j].end, weight= edges[j].weight;if (path[end] > path[start] + w)  path[end] = path[start] + weight;}
}

证明

Bellman-Ford的实际原理就是能够遍历从起点到任意点之间的所有路径,
从而理所当然的得出最小的值,我们举一个例子,如下图,1-5的最短路径是1-3-2-5
在这里插入图片描述
我们让边数组中按照与最短路径1-3-2-5颠倒的顺序排序就会发现,无论如何排,Bellman-Ford都能遍历到所有点之间所有的路径。
在这里插入图片描述

侦查负权环

当我们外循环遍历node.length - 1次之后,所有的点的距离都不应该发生变化了,如果第node.length遍遍历还有点缩小,说明存在一个可以无限缩短距离的负权环,此时到任何点都不存在最短路径,因为可以无限次绕环减少路径再到其他点。
举个具体例子,这里图片大家放大卡,如果是截成两张的话需要往下来反而更麻烦。
在这里插入图片描述

可以细想一下,如果有负权圈,BellMan-Ford的遍历特性一定能保证其在外层for循环遍历第node.length次时绕圈一次。因为前面所有路径被遍历完,最后一次遍历会将所有可能路径的终点和可到达的下一个点连接,如果存在负权圈就会使其刚使其头尾相连。

据说检测负环有个更好的办法SPFA,这里不是刚需就不看了。大家有兴趣可以自己去了解

下一篇文章学习一下A*寻路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2905120.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Linux内核之最核心数据结构之一:struct file(三十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

产品SDK化转型:标准化与机构个性化定制解决方案

一、背景 在互联网行业中&#xff0c;企业通常可分为两大类别&#xff1a;2C和2B。对于2B企业而言&#xff0c;它们的产品往往以产品的形式提供给各个合作机构。以金融领域为例&#xff0c;一家2B金融公司通常将产品销售给各个银行和证券公司&#xff0c;这是2B领域常见的做法…

2.11 Python关键字(保留字)

Python关键字&#xff08;保留字&#xff09;一览表 保留字是Python 语言中一些已经被赋予特定意义的单词&#xff0c;这就要求开发者在开发程序时&#xff0c;不能用这些保留字作为标识符给变量、函数、类、模板以及其他对象命名。 Python 包含的保留字可以执行如下命令进行…

企业网站建设的方法的相关问题的解决办法的问题

现在市场上比较大的公司都建立了自己的企业网站&#xff0c;比如华为、小米等&#xff0c;在他们的企业网站中&#xff0c;可以充分展示自己产品的优势&#xff0c;介绍公司的优质服务。 这都是让顾客改变购买想法的重要因素。 现在互联网发达了&#xff0c;很多人在购买产品的…

k8s局域网通过operator部署rabbitmq

参考&#xff1a;Installing RabbitMQ Cluster Operator in a Kubernetes Cluster | RabbitMQ 1、下载cluster-operator.yml wget https://github.com/rabbitmq/cluster-operator/releases/download/v2.7.0/cluster-operator.yml 2、拉取对应的镜像&#xff0c;这里的版本是根…

腾讯云4核8g服务器多少钱?2024轻量和CVM收费价格表

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

最优算法100例之10-数组中重复出现多次的数

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不…

安全的内网通讯软件,WorkPlus定制化 IM/办公门户解决方案

如今处于数字化转型的“加速期”&#xff0c;政企正经历着一场数字化迭代升级的时代浪潮。而不少企业都已具备了数字化管理的意识&#xff0c;数字化应用场景也在全面推开。WorkPlus不断推动信息技术与企业业务深度融合&#xff0c;作为安全的内网通讯软件&#xff0c;为企业提…

【算法刷题 | 二叉树 05】3.28(左叶子之和、找树 左下角的值)

文章目录 11.左叶子之和11.1问题11.2解法一&#xff1a;递归11.2.1递归思路11.2.2代码实现 11.3解法二&#xff1a;栈11.3.1栈思想11.3.2代码实现 12.找树左下角的值12.1问题12.2解法一&#xff1a;层序遍历 11.左叶子之和 11.1问题 给定二叉树的根节点 root &#xff0c;返回…

|行业洞察·汽车|《2024新能源汽车行业及营销趋势报告-20页》

报告的主要内容解读&#xff1a; 新能源汽车行业概述及品牌分布&#xff1a; 近年来&#xff0c;中国新能源汽车销量增速高&#xff0c;市场占有率快速提升&#xff0c;成为汽车行业的重要增量。新能源汽车消费者趋向年轻化、女性化和高端化&#xff0c;对高科技、新体验有较高…

LeetCode:718最长重复子数组 C语言

718. 最长重复子数组 提示 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,…

解决:npx nuxi@latest module add image 问题

背景 在 nuxtJS项目中使用内置组件 NuxtImg , 按照官方操作如下图进行安装&#xff0c;在npm run dev 时&#xff0c;出现了报错&#xff1a; "ipx" is imported by "node_modules/nuxt/image/dist/runtime/ipx.mjs", but could not be resolved – treat…

Unity 学习日记 12.小球撞击冰块游戏

目录 1.准备场景 2.让小球动起来 3.用鼠标把小球甩出去 4.加入鼠标点击小球的判断 5.小球与冰块的碰撞测试 6.撞击后销毁冰块 ​编辑 7.显示游戏计时 8.显示扔球次数 9.显示剩余冰块个数 10.游戏结束 11.完整代码 下载源码 UnityPackage 最终效果&#xff1a; 1.准…

机器学习(三)

神经网络: 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络&#xff0c;它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。 f为激活(响应)函数: 理想激活函数是阶跃函数&#xff0c;0表示抑制神经元而1表示激活神经元。 多层前馈网络结构: BP(误差逆…

Git命令上传本地项目至github

记录如何创建个人仓库并上传已有代码至github in MacOS环境 0. 首先下载git 方法很多 这里就不介绍了 1. Github Create a new repository 先在github上创建一个空仓库&#xff0c;用于一会儿链接项目文件&#xff0c;按照自己的需求设置name和是否private 2.push an exis…

步态采集平台

&#x1f349;步骤一、读取视频每一帧图像 &#x1f349;步骤二、对读取的图像进行分割&#xff0c;得到全景下的步态轮廓图。 ​​​​​​​&#x1f349;步骤三、对读取的图像进行裁剪得到归一化的步态轮廓图。 ​​​​​​​&#x1f349;步骤四、保存这一帧步态轮廓图

MongoDB Atlas维护指南:常见类型、注意事项与窗口设置

为了给Atlas用户更好的产品体验&#xff0c;MongoDB产品团队会进行定期维护。 本文将会介绍&#xff1a; 常见维护项目种类及频率&#xff0c;注意事项维护期间的影响及建议维护窗口设置说明维护告警设置和邮件通知范例 维护窗口常见项目 定期SSL证书轮换软件升级&#xff…

Git--08--Git分支合并操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Git分支合并操作案例流程客户端&#xff1a;GitExtensions操作步骤&#xff1a;A操作步骤&#xff1a;B操作步骤&#xff1a;C操作步骤&#xff1a;D操作步骤&#…

多焦点图像融合文献学习(一)

本文介绍的是一篇明为"A convolutional neural network-based conditional random field model for structured multi-focus image fusion robust to noise."的文献&#xff0c;主要包括文献的摘要、前言摘选、主要贡献、网络结构、实验结果及结论等方面。 文献名称摘…

DC电源模块的设计与制造流程

BOSHIDA DC电源模块的设计与制造流程 DC电源模块是一种用于将交流电转换为直流电的设备。它广泛应用于各种电子设备中&#xff0c;如电子产品、工业仪器、电视等。下面是DC电源模块的设计与制造流程的简要描述&#xff1a; 1. 需求分析&#xff1a;在设计DC电源模块之前&#…