(代码随想录)BEllman_ford算法 及其优化 SPFA

代码随想录

(知识提炼)

Bellman_ford算法

用处

解决带负权值的单源最短路问题

核心思想

 对所有边进行松弛n-1次操作(n为节点数量),从而求得目标最短路

何为松弛

minDist[B] 表示 到达B节点 最小权值,minDist[B] 有哪些状态可以推出来?

状态一: minDist[A] + value 可以推出 minDist[B] 状态二: minDist[B]本身就有权值 (可能是其他边链接的节点B 例如节点C,以至于 minDist[B]记录了其他边到minDist[B]的权值)

 则   通过 A 到 B 这条边可以获得更短的到达B节点的路径,即如果 minDist[B] > minDist[A] + value,那么我们就更新 minDist[B] = minDist[A] + value ,这个过程就叫做 “松弛” 。

为何是松弛n - 1次?

对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离。(这里建议看原文去理解,单看这个不好理解)

算法题秒杀思路(用于解决什么问题)

求得目标最短路径

SPFA   

即  Bellman_ford队列优化算法

优势

只需要对 上一次松弛的时候更新过的节点作为出发节点所连接的边 进行松弛就够了

用队列来记录上次松弛的时候更新过的节点。(其实用栈也行)

拓展

有正权回路也没关系,使用队列优化,有元素重复加入队列,也会因为最后 minDist数组 不会在发生变化而终止。

应用

bellman_ford之判断负权回路

代码随想录

在 bellman_ford 算法中,松弛 n-1 次所有的边 就可以求得 起点到任何节点的最短路径,松弛 n 次以上,minDist数组(记录起到到其他节点的最短距离)中的结果也不会有改变 .

有负权回路的情况下,一直都会有更短的最短路,所以 松弛 第n次,minDist数组 也会发生改变.

法一:使用Bellman_ford算法再多松弛一次.

法二:使用SPFA算法,判断如果重复加入队列的某元素次数超过了极限n - 1次(在极端情况下,即:所有节点都与其他节点相连,每个节点的入度为 n-1 (n为节点数量),所以每个节点最多加入 n-1 次队列。)就代表存在负权回路.

bellman_ford之单源有限最短路

代码随想录

即限制节点数.

原算法是"节点数量为n,起点到终点,最多是 n-1 条边相连。 那么对所有边松弛 n-1 次 就一定能得到 起点到达 终点的最短距离。"

而这里是"最多经过 k 个城市, 那么是 k + 1条边相连的节点",即在Bellman_ford算法中缩减松弛的次数就行,缩减为k + 1次

注意:但其实,每一次松弛的过程中,由于我们便利的是整个mindist数组,那么就不可避免的会有很多个节点进行了松弛,我们需要进行k次松弛,但是每一次松弛则松弛了不只一个节点,这就是问题所在,

因此,万能的卡尔提出了使用minDist_copy来记录上一次松弛后minDist数组,并且当下minDist数组的改变完全依据上一次松弛后的minDist,这就真正实现了每次松弛时不会依据本次已经松弛后的节点进行改变.(感觉自己讲的还是有点云里雾里,还是看原文好理解一点)

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

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

相关文章

代码随想录算法训练营第十六天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

530.二叉搜索树的最小绝对差 题目链接:. - 力扣(LeetCode) 文章讲解:代码随想录 视频讲解:二叉搜索树中,需要掌握如何双指针遍历!| LeetCode:530.二叉搜索树的最小绝对差_哔哩哔哩…

大数据分析案例-基于随机森林算法的智能手机价格预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

mtr mysql-test-run.pl — Run MySQL Test Suite

The mysql-test-run.pl Perl script is the main application used to run the MySQL test suite. pl Perl脚本是用来运行MySQL测试套件的主要应用程序。 It invokes mysqltest to run individual test cases. 它调用mysqltest来运行单独的测试用例。 Invoke mysql-test-run.pl…

华为云计算知识总结——及案例分享

目录 一、华为云计算基础知识二、华为云计算相关案例实战案例一:搭建弹性云服务器(ECS)并部署Web应用案例二:构建基于OBS的图片存储和分发系统案例三:基于RDS的高可用数据库应用案例四:使用华为云DDoS防护保…

计算合约方法的签名

计算合约方法的签名 通过智能合约实现 // SPDX-License-Identifier: MIT pragma solidity ^0.8.26;contract FunctionSelector {/*"transfer(address,uint256)"0xa9059cbb"transferFrom(address,address,uint256)"0x23b872dd*/function getSelector(stri…

Ant-Dseign-Pro如何去国际化及删除oneapi.json后出现程序直接结束问题的解决方案

作者:CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境:WebStorm 移除国际化 什么是国际化 在AntDesignPro当中,国际化就是如果你初始默认使用中文,想要切换英文,我们可以切换到英文模式。同时&#x…

太速科技-9-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡

基于DSP TMS320C6678FPGA XC7V690T的6U VPX信号处理卡 一、概述 本板卡基于标准6U VPX 架构,为通用高性能信号处理平台,系我公司自主研发。板卡采用一片TI DSP TMS320C6678和一片Xilinx公司Virtex 7系列的FPGA XC7V690T-2FFG1761I作为主处理器&#…

Mysql当中的各种log

一、MySQL日志文件类型 重做日志(redo log)回滚日志(undo log)二进制日志(binlog)错误日志(errorlog)慢查询日志(slow query log)一般查询日志(g…

自定义规则配置教程

大家在使用waf的时候,因为业务特殊性和waf的严格校验,有时会产生误报,阻拦合法流量。 这个时候,只能通过自定义规则进行补充,选择加白名单或者黑名单。 很多人会说配置黑白名单失效了,其实95%以上都是自己…

Java项目:图书管理系统(有源代码)

Java项目:图书管理系统(有源代码) 直接上项目实现效果,文末有源码获取方式 一、技术选型 • Spring Boot、Vue、MySQL、Redis 二、功能说明 用户功能 图书查询功能 读者规则功能 查看公告 个人信息 借阅信息 违章信息 读者留言…

鸿蒙生态崛起:开发者机遇、挑战与未来展望

背景 鸿蒙系统不断发展,有与安卓、iOS 形成三足鼎立之势,且其在智能手机、智能穿戴、车载、家居等行业领域的应用越来越广泛。作为开发者,如何抓住鸿蒙生态崛起的机遇,解决开发挑战,创造更好的应用体验?欢…

MYSQL复合查询

当我们要查询的数据要使用的限制条件不是很简单的时候,可能要在一个限制条件下再次限制,比如要查找小美所在公司的平均薪资,就要先找到小美的公司,再求平均薪资。复合查询分三种,多表连接查询、子句查询和合并查询。 …

【论文阅读笔记】VLP: A Survey on Vision-language Pre-training

目录 前言2 特征提取(Feature extraction)2.1.1 图象特征提取OD-based Region feature / RoIFreeze the pre-trained object detectorsGrid features(网格特征)CNN-GFsEnd-to-End Training(端到端训练)ViT-…

U盘插入电脑不显示?别急,这里有解决方案!

随着科技的飞速发展,U盘已成为我们日常生活和工作中不可或缺的数据存储工具。然而,你是否遇到过这样的情况:满心欢喜地将U盘插入电脑,却发现电脑竟然“视而不见”,U盘图标迟迟不出现?别急,这种情…

如何使用Web-Check和cpolar实现安全的远程网站监测与管理

文章目录 前言1.关于Web-Check2.功能特点3.安装Docker4.创建并启动Web-Check容器5.本地访问测试6.公网远程访问本地Web-Check7.内网穿透工具安装8.创建远程连接公网地址9.使用固定公网地址远程访问 前言 本期给大家分享一个网站检测工具Web-Check,能帮你全面了解网…

【第一个qt项目的实现和介绍以及程序分析】【正点原子】嵌入式Qt5 C++开发视频

qt项目的实现和介绍 1.第一个qt项目  (1).创建qt工程    [1].创建一个存放qt的目录    [2].新建一个qt工程    [3].编译第一个工程    发生错误时的解决方式 二.QT文件介绍  (1).工程中文件简单介绍  (2).项目文件代码流程介绍    [1].添…

【Linux】命令行参数 | 环境变量

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 前几天在搞硬件&…

【数据结构与算法】第7课—数据结构之队列

文章目录 1. 队列1.1 什么是队列1.2 队列的结构1.3 队列初始化1.4 队列入栈1.5 出队列1.6 查找队列有效元素个数1.7 取队头和队尾数据1.8 销毁链表 2. 用两个队列实现栈3. 用两个栈实现队列4. 循环队列 1. 队列 注:文中Queue是队列,Quene是错误写法 1.1 …

数据结构 ——— 向上/向下调整算法将数组调整为升/降序

目录 向上调整算法(默认小堆) 向下调整算法(默认小堆) 利用向上调整算法对现有数组直接建堆 利用向下调整算法对以建成的小堆数组排降序 举一反三: 那么如何将数组 a 排成升序呢? 向上调整算法&…

一种基于GPU的归并排序并行实现

0️⃣归并排序流程 分割过程:将待排序数组等分为左右子数组,再对左右子数组递归式等分,直至不可分割合并过程:将所有子数组两两递归合并,逐步得到较大有序数组,直到得到完整有序数组 1️⃣传统的并行归并 …