图论详解——Bellman-Ford(清晰易懂)

news2025/2/24 18:36:00

开学第一周,晚上属实作业有点乱

于是就拖更了一周


今天我们来讲解一下图论最短路径算法中

最简单

最清晰易懂

同时时间复杂度最高的算法

它的时间复杂度能达到O(VE)(点的数量*边的数量)

在学习Bellman-Ford之前,你需要先学会链式前向星

大家可以上网或者其他途径自行查阅一下

  1. 原理

这个算法是对图进行v-1次松弛操作(v为点的数量)

完了?

啊 完了


松弛看不懂没事

继续往下看

正式开始讲原理:

日常建个小图

有没有权值无所谓,没有权值就当作1

假设我们要求1点到5点的最短路径

第一步:把1连接的所有边的目标点更新最短路径路径

最短路径更新成现在这样

现在更新2的

这是可以发现,1到5的路程可以更新了

2+7<10

所以更新

然后剩下的就没什么可更新的了

这样算出来,1到5的最短路程就是9


上面一套流程,就是我们用贝尔曼福特算法的过程

而2+7<10这步,就叫做松弛操作

松弛N-1次,每次都遍历每个点的每条边,能松则松,不能松就不松


没错 贝尔曼福特还是这么简单

但这也造成了他时间复杂度贼高

就比如上图

3的松弛根本没用,也造成了时间上的问题

如果n<=10^6

那浪费的时间不可设想

另外 它还有一个优点

就是能处理负权环

怎么处理呢?

先来看下普通代码

# include <iostream>
# include <cstdio>
# include <cmath>
# include <cstring>
using namespace std;
# define int long long
# define N 10005
# define M 10005
int s,t,n,m,m2;
double f[N];
struct node{
    int x,y;
}a[N];
struct node2{
    int to,next;
    double w;
}e[M];
int adj[N];
void add(int u,int v,double w2){
    m2++;
    e[m2].to=v;
    e[m2].w=w2;
    e[m2].next=adj[u];
    adj[u]=m2;
    return ;
}
void relax(int u,int v,double w2){
    if (f[v]>f[u]+w2){
        f[v]=f[u]+w2;
    }
    return ;
}
void ford(){
    memset(f,0x7f7f,sizeof(f));
    f[s]=0;
    for (int i=1;i<=n-1;i++){
        for (int j=1;j<=n;j++){
            for (int k=adj[j];k;k=e[k].next){
                int l=e[k].to;
                relax(j,l,e[k].w);
            }
        }
    }
    return ;
}
signed main(){
    ford();
    printf("%.2lf",f[t]);
    return 0;
}

本代码编写的是从s到t的最短路径,所以f[i]表示s到i的最短路径


解决下刚才的问题:负权环怎么解决

因为我们是n-1次松弛操作

在这种情况下,保证能把这个图的最短路径求出来

而负权环什么意思?他不可能有最短路径

就是这个样子了

他每绕一圈,路径都-14

所以无限循环求不出

要想检测这种情况

就要松弛n次,如果第n次还有可以能松弛的

那说明就是负权环


有些同学就要问了

f数组不是动态规划里的吗?而且这个松弛操作为什么看上去这么像动态规划的状态转移方程啊?

没错你的直觉是正确的

自己的算法用自己的成就 天经地义()

今天的Bellman-Ford算法的讲解就到这里

如果还有哪些问题或不懂的地方 随时可以评论

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

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

相关文章

固态继电器与普通继电器的区别

固态继电器 固态继电器是一种全电子电路组合元件&#xff0c;它依靠半导体器件和电子元件的电磁和光学特性来完成其隔离和继电器开关功能。与传统的电磁继电器相比&#xff0c;固态继电器是一种没有机械和运动部件的继电器&#xff0c;但具有与电磁继电器基本相同的功能。 固…

经典布局 (flex和传统两种实现) 左右两栏式

1.混合浮动普通流 混合浮动普通流 父级&#xff1a;宽度固定 left:宽度固定。浮动起来 right:宽度和父级一样&#xff0c;设定margin-right:left的宽度px,宽度随父级变化而变化&#xff08;固定自适应&#xff09; <!DOCTYPE html> <html lang"en"> <…

超店有数,为什么商家要使用tiktok达人进行营销推广呢?

近几年互联网发展萌生出更多的短视频平台&#xff0c;而tittok这个平台在海外也越来越火爆。与此同时&#xff0c;很多商家也开始用tiktok进行营销推广。商家使用较多的方式就是达人营销&#xff0c;这种方法很常见且转化效果不错。那为什么现在这么多商家喜欢用tiktok达人进行…

Jmeter参数提取器-如何使用 json提取器及设置全局变量来调用

在jmeter接口测试的过程中&#xff0c;经常会遇到了需要关联参数的情况&#xff0c;在接口响应后&#xff0c;提取请求返回结果中的某个值或者某一组值&#xff0c;作为下一个接口的入参&#xff0c;例如token或者其他变量&#xff0c;需要设置成全局变量或者局部变量来给下个接…

边界检测方法总结

1&#xff1a;经典的边界检测方法有sobel&#xff0c;拉普拉斯&#xff0c;canny等。 sobel&#xff1a; def get_sobel(in_chan, out_chan):filter_x np.array([[1, 0, -1],[2, 0, -2],[1, 0, -1],]).astype(np.float32)filter_y np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -…

如何使用 ChatGPT 编写 SQL JOIN 查询

通过清晰的示例和解释&#xff0c;本文展示了 ChatGPT 如何简化和简化创建复杂 MySQL 查询的过程&#xff0c;使用户更容易与数据库交互并检索他们需要的数据。无论您是初学者还是经验丰富的开发人员&#xff0c;本文都提供了有关如何利用 ChatGPT 来增强您的 MySQL 查询编写技…

51内核单片机实现Bootloader跳转到用户程序,要求两个程序都要支持中断

Flash空间规划 本文使用的单片机为笙科的A9129F6&#xff0c;Flash大小为64KB&#xff0c;其空间规划如下。 起始地址结束地址用途0x00000x3fff Bootloader程序 0x40000xefff 用户程序&#xff08;APP程序&#xff09; 0xf000 0xffff 存放设备配置信息 程序间跳转实现起来很…

【算法基础】一维前缀和 + 二维前缀和

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有…

大A社群丨全球宽基ETF轮动(GP02)

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 『正文』 ˇ 大家好&#xff0c;今天我们分享股票社群第2期量化策略——ETF轮动。 根据我们在12月份预售投票情况看&#xff0c;大家还是比较倾向于技术多因子和ETF轮动&#xff0c;如下图所示&#…

googletest 笔记

什么是一个好的测试 1 测试应该是独立的和可重复的。调试一个由于其他测试而成功或 失败的测试是一件痛苦的事情。googletest 通过在不同的对象上 运行测试来隔离测试。当测试失败时&#xff0c;googletest 允许您单独运 行它以快速调试。 2 测试应该很好地“组织”&#xff0c…

循环、函数、对象——js基础练习

目录 一、循环练习 1.1 取款机案例 1.2 九九乘法表 1.3 根据数据生成柱形图 1.4 冒泡排序 1.6综合大练习 二、函数 2.1 转换时间案例 三、对象 1. 遍历数组对象 2. 猜数字游戏 3. 生成随机颜色 4. 学成在线页面渲染案例 一、循环练习 1.1 取款机案例 // 准备一个…

多 态

1多态的基本概念多态是C面向对象三大特性之一多态分为两类静态多态: 函数重载和运算符重载属于静态多态&#xff0c;复用函数名动态多态: 派生类和虚函数实现运行时多态静态多态和动态多态区别:静态多态的函数地址早绑定–--编译阶段确定函数地址动态多态的函数地址晚绑定–--运…

操作系统(day13)-- 虚拟内存;页面分配策略

虚拟内存管理 虚拟内存的基本概念 传统存储管理方式的特征、缺点 一次性&#xff1a; 作业必须一次性全部装入内存后才能开始运行。驻留性&#xff1a;作业一旦被装入内存&#xff0c;就会一直驻留在内存中&#xff0c;直至作业运行结束。事实上&#xff0c;在一个时间段内&…

usb闪存驱动器数据恢复该怎么进行?3个方法总结

“怎么办&#xff1f;我的USB驱动器不知道因为什么原因&#xff0c;里面的数据、文件都消失了。有没有什么方法在没有进行备份的情况下恢复从U盘丢失的数据&#xff1f;” USB驱动器作为最常用的存储移动设备&#xff0c;里面保存着各种文件数据。但是有时会出现损坏而导致数据…

麦克风分类汇总

1.麦克风分类汇总 1)按声电转换原理分为&#xff1a;电动式&#xff08;动圈式、铝带式&#xff09;&#xff0c;电容式&#xff08;直流极化式&#xff09;、压电式&#xff08;晶体式、陶瓷式&#xff09;、以及电磁式、碳粒式、半导体式等。 2)按声场作用力分为&#xff1a…

广域网技术(PAP和CHAP)

第十六章&#xff1a;广域网技术 随着经济全球化与数字化变革加速&#xff0c;企业规模不断扩大&#xff0c;越来越多的分支机构出现在不同的地域。每个分支的网络被认为一个LAN&#xff08;Local Area Network&#xff0c;局域网&#xff09;&#xff0c;总部和各分支机构之间…

Tr0ll1靶机训练

信息收集 主机探测 端口扫描 21,22,80端口开放通过浏览器访问并进行指纹识别&#xff0c;并没没有发现什么有用信息 测试 观察发现21端口开放&#xff08;ftp&#xff09;尝试进行匿名登录发现其中存在一个流量文件将其下载 并将文件用wirwshark打开&#xff0c;追踪其TCP流(…

451个PyPI包安装Chrome扩展以窃取加密信息

发现有超过450个恶意的PyPI Python软件包会安装恶意浏览器扩展&#xff0c;以劫持基于浏览器的加密钱包和网站进行的加密货币交易。自2022年11月首次启动后&#xff0c;至今仍在延续&#xff0c;从最初只有27个恶意的PyPI软件包&#xff0c;在过去几个月中到现在正大幅扩张。这…

RocketMQ事务消息

RocketMQ事务消息 RocketMq提供的一种高级消息类型&#xff0c;支持在分布式场景下面保障消息生产和本地事务的一致性 生产者将消息发送到服务端服务端将消息持久化成功后&#xff0c;向生产者返回ACK确认消息发送成功&#xff0c;此时消息状态为待投递,这种状态下的消息称之为…

2、MySQL5.7安装

前言&#xff1a;工具下载地址阿里云盘&#xff1a;MySQL&#xff1a;https://www.aliyundrive.com/s/o37N4pWdzyz提取码: xs12一、MySQL安装包下载MySQL官方网站下载速度太慢&#xff0c;这里推荐使国内的开源镜像站。推荐清华大学镜像站&#xff1a;https://mirrors.tuna.tsi…