当前位置: 首页 > news >正文

8 Bellman Ford算法SPFA

图论 —— 最短路 —— Bellman-Ford 算法与 SPFA_通信网理论基础 分别使用bellman-ford算法和dijkstra算法的应用-CSDN博客

图解Bellman-Ford计算过程以及正确性证明 - 知乎 (zhihu.com)

语雀版本

1 概念

**适用场景:**单源点,可以有负边,不能有负权环。

**dis(v):**源点s到v的距离。初始话dis(s)=0,其余为无穷大。

**n:**顶点数

**m:**边数

复杂度O(mn):对边进行n-1次遍历。如果dis(v)>dis(u)+e(u,v),则更新dis(v)=dis(u)+e(u,v)

**合理性:**基于这个方式,每次遍历起码有一个点的dis(v)是得到最优值。所以遍历n-1次就够了。

负权环:环的权值和为负。如果按上述的方式遍历,很有可能会导致某个点的dis值经过环之后变得更小。重复遍历后越来越小。

**判断负权环:**三角不等式。无负权环时,n-1次后所有dis都是最优。如果有,则会导致得不到最小dis。基于这一点,可以在n-1次后,再遍历一次,如果还存在dis(v)>dis(u)+e(u,v),则有负权环。

2 实现

2.1 n-1次遍历

void Bellman_Ford()
{for(int i=0;i<n;i++) dis[i]=INF;dis[0]=0;for(int i=1;i<=n-1;i++)for(int j=1;j<=m;j++)//枚举所有边{int x=u[j];//边j的起点int y=v[j];//边j的终点if(dis[x]<INF)//松弛dis[y]=min(dis[y],dis[x]+w[j]);}
}

2.2 第n次变量——三角布不等式判断环

void Bellman_Ford()
{for(int i=0;i<n;i++) dis[i]=INF;dis[0]=0;for(int i=1;i<=n-1;i++)for(int j=1;j<=m;j++)//枚举所有边{int x=u[j];//边j的起点int y=v[j];//边j的终点if(dis[x]<INF)//松弛dis[y]=min(dis[y],dis[x]+w[j]);}for(int j=1;j<=m;j++)//枚举所有边{int x=u[j];//边j的起点int y=v[j];//边j的终点if(dis[y]>dis[x]+w[j])//cout<<"有负权环";return;}
}

3 SPFA-基于队列的优化

SPFA:Shortest Path Faster Algorithm。用队列来记录待遍历的点,每次不遍历所有边,只遍历和改点相邻的边。

3.1 实现

可以用双向队列,把dis小的点放在队首,提高遍历时更新的效率(更快完成所有dis更新)
struct Edge{int to,dis;
};
vector<Edge> edge[N];
bool vis[N];
int dis[N];
void SPFA(int s) {memset(dis, INF, sizeof(dis));memset(vis, false, sizeof(vis));vis[s] = true;dis[s] = 0;deque<int> Q;Q.push_back(s);while (!Q.empty()) {int x = Q.front();Q.pop_front();vis[x] = 0;for (int i = 0; i < edge[x].size(); i++) {int y = edge[x][i].to;if (dis[y] > dis[x] + edge[x][i].to) {dis[y] = dis[x] + edge[x][i].to;if (!vis[y]) {vis[y] = true;if (!Q.empty() && dis[y] < dis[Q.front()])//加入队首Q.push_front(y);else//加入队尾Q.push_back(y);}}}}
}

3.2 判断负环-判断每个点进队列的次数(大于n)

struct Edge {int from, to;int dis;Edge() {}Edge(int from, int to, int dis) : from(from), to(to), dis(dis) {}
};
struct SPFA {int n, m;Edge edges[N]; //所有的边信息int head[N];   //每个节点邻接表的头int next[N];   //每个点的下一条边int pre[N];    //最短路中的上一条弧bool vis[N];int dis[N];int cnt[N]; //进队次数void init(int n) {this->n = n;this->m = 0;memset(head, -1, sizeof(head));}void AddEdge(int from, int to, int dist) {edges[m] = Edge(from, to, dist);next[m] = head[from];head[from] = m++;}bool negativeCycle(int s) { //判负环memset(vis, false, sizeof(vis));memset(cnt, 0, sizeof(cnt));memset(dis, INF, sizeof(dis));dis[s] = 0;queue<int> Q;Q.push(s);while (!Q.empty()) {int x = Q.front();Q.pop();vis[x] = false;for (int i = head[x]; i != -1; i = next[i]) {Edge &e = edges[i];if (dis[e.to] > dis[x] + e.dis) {dis[e.to] = dis[x] + e.dis;pre[e.to] = i;if (!vis[e.to]) {vis[e.to] = true;Q.push(e.to);if (++cnt[e.to] > n)return true;}}}}return false;}
} spfa;
int main() {int n, m;while (scanf("%d%d", &n, &m) != EOF) {spfa.init(n);int S;scanf("%d", &S);for (int i = 1; i <= m; i++) {int x, y, dis;scanf("%d%d%d", &x, &y, &dis);//无向边添边两次spfa.AddEdge(x, y, dis);spfa.AddEdge(y, x, dis);}spfa.negativeCycle(S);for (int i = 1; i <= n; i++)printf("%d\n", spfa.dis[i]);}return 0;
}

相关文章:

8 Bellman Ford算法SPFA

图论 —— 最短路 —— Bellman-Ford 算法与 SPFA_通信网理论基础 分别使用bellman-ford算法和dijkstra算法的应用-CSDN博客 图解Bellman-Ford计算过程以及正确性证明 - 知乎 (zhihu.com) 语雀版本 1 概念 **适用场景&#xff1a;**单源点&#xff0c;可以有负边&#xff0…...

nginx不允许静态文件被post请求显示405 not allowed

在单独站点的配置文件中 添加error_page 405 200 $request_uri; 即可&#xff01;...

【c++笔试强训】(第三十二篇)

目录 数组变换&#xff08;贪⼼位运算&#xff09; 题目解析 讲解算法原理 编写代码 装箱问题&#xff08;动态规划-01背包&#xff09; 题目解析 讲解算法原理 编写代码 数组变换&#xff08;贪⼼位运算&#xff09; 题目解析 1.题目链接&#xff1a;数组变换__牛客网…...

shell脚本实战案例

文章目录 实战第一坑功能说明脚本实现 实战第一坑 实战第一坑&#xff1a;在Windows系统写了一个脚本&#xff0c;比如上面&#xff0c;随后上传到服务&#xff0c;执行会报错 原因&#xff1a; 解决方案&#xff1a;在linux系统touch文件&#xff0c;并通过vim添加内容&…...

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…...

lvgl9 Line(lv_line) 控件使用指南

文章目录 前言主体1. **Line 控件概述**2. **使用场景**3. **控件的样式**4. **设置点**5. **自动大小**6. **y 坐标反转**7. **事件处理**8. **示例代码** 总结 前言 在图形界面设计中&#xff0c;直线绘制是非常常见且重要的功能之一&#xff0c;尤其是在需要进行图形表示、…...

区块链概念 Web 3.0 实操

1. Web 3.0 概述 1.1 定义与背景 Web 3.0&#xff0c;也称为第三代互联网&#xff0c;是一个新兴的概念&#xff0c;它代表着互联网的未来发展和演进方向。Web 3.0的核心理念是去中心化、用户主权和智能化。这一概念的提出&#xff0c;旨在解决Web 2.0时代中用户数据隐私泄露…...

【人工智能】大数据平台技术及应用

文章目录 前言一、大数据平台基本概念及发展趋势1、数据量爆发式增长&#xff0c;发数据蓬勃发展2、大数据到底是什么&#xff1f;3、大数据处理与传统数据处理的差异4、为什么要建立大数据平台&#xff1f;5、大数据平台开源架构-Hadoop6、华为云大数据平台架构 二、大数据技术…...

Scala的模式匹配(7)

package hfdobject Test35 {case class Person(name:String)case class Student(name:String,className:String)//match case 能根据 类名和属性的信息&#xff0c;匹配到对应的类//注意&#xff1a;//1 匹配的时候&#xff0c;case class的属性个数要对上//2 数学名不需要一一…...

使用 MATLAB 绘制三维散点图:根据坐标和距离映射点的颜色和大小

在数据可视化中&#xff0c;三维散点图是一种非常直观的方式来展示数据的分布。MATLAB 提供了强大的 scatter3 函数&#xff0c;可以用来绘制三维散点图&#xff0c;而通过调整点的颜色和大小&#xff0c;可以进一步增强图形的表现力。 在本篇博客中&#xff0c;我们将逐步讲解…...

数仓技术hive与oracle对比(五)

附录说明 附录是对测试过程中涉及到的一些操作进行记录和解析。 oracle清除缓存 alter system flush shared_pool; 将使library cache和data dictionary cache以前保存的sql执行计划全部清空&#xff0c;但不会清空共享sql区或者共享pl/sql区里面缓存的最近被执行的条目。刷…...

金融数学在股市交易中的具体应用

### 1. 风险管理 - **VaR&#xff08;在险价值&#xff09;**: VaR是衡量投资组合潜在损失的指标。例如&#xff0c;如果一个投资组合的VaR为100万元&#xff0c;置信水平为95%&#xff0c;这意味着在未来的一个交易日内&#xff0c;有95%的可能性该投资组合的损失不会超过100…...

Spring6:1 概述

Spring6&#xff1a;1 概述 标签 JAVASpring 目录 Spring 是什么&#xff1f;Spring 的狭义和广义 广义的 Spring&#xff1a;Spring 技术栈狭义的 Spring&#xff1a;Spring Framework Spring Framework 特点Spring 模块组成Spring6 特点 版本要求本课程软件版本 1. 概述 …...

Python Selenium 各浏览器驱动下载与配置使用(详细流程)

1、安装 pip install selenium 2、浏览器驱动下载 Chrome(google)浏览器驱动 下载地址&#xff1a;http://chromedriver.storage.googleapis.com/index.html 或 https://sites.google.com/a/chromium.org/chromedriver/home . 下载地址&#xff1a;http://chromedriver.stor…...

C语言期末考试——重点考点

目录 1.C语言的结构 2.三种循环结构 3.逻辑真假判断 4. printf函数 5. 强制类型转化 6. 多分支选择结构 7. 标识符的定义 8. 三目运算符 1.C语言的结构 选择结构、顺序结构、循环结构 2.三种循环结构 for、while、do-while 3.逻辑真假判断 C语言用0表示false,用非0(不…...

mongo开启慢日志及常用命令行操作、数据备份

mongo开启慢日志及常用命令行操作、数据备份 1.常用命令行操作2.mongo备份3.通过命令临时开启慢日志记录4.通过修改配置开启慢日志记录 1.常用命令行操作 连接命令行 格式&#xff1a;mongo -u用户名 -p密码 --host 主机地址 --port 端口号 库名&#xff1b; 如&#xff1a;连…...

Mybatis-Plus的主要API

一、实体类操作相关API BaseMapper<T>接口 功能&#xff1a;这是 MyBatis - Plus 为每个实体类对应的 Mapper 接口提供的基础接口。它提供了一系列基本的 CRUD&#xff08;增删改查&#xff09;操作方法。例如insert(T entity)方法用于插入一条记录&#xff0c;d…...

2023 年“泰迪杯”数据分析技能赛B 题企业财务数据分析与造假识别

2023 年“泰迪杯”数据分析技能赛B 题企业财务数据分析与造假识别 一、背景 财务数据是指企业经营活动和财务结果的数据记录&#xff0c;反映了企业的财务状况 与经营成果。对行业、企业的财务数据进行分析&#xff0c;就是要评价其过去的经营业绩、 衡量现在的财务状况、预测…...

【SpringMVC】参数传递 重定向与转发 REST风格

文章目录 参数传递重定向与转发REST风格 参数传递 ModelAndView&#xff1a;包含视图信息和模型数据信息 public ModelAndView index1(){// 返回页面ModelAndView modelAndView new ModelAndView("视图名");// 或// ModelAndView modelAndView new ModelAndView(…...

性能测试需求分析(超详细总结)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、客户方提出 客户方能提出明确的性能需求&#xff0c;说明对方很重视性能测试&#xff0c;这样的企业一般是金融、电信、银行、医疗器械等&#xff1b;他们…...

5步轻松上手:Grasscutter命令生成器实用指南

5步轻松上手&#xff1a;Grasscutter命令生成器实用指南 【免费下载链接】GrasscutterCommandGenerator Command Generator and Gacha Banner Editor 项目地址: https://gitcode.com/gh_mirrors/gr/GrasscutterCommandGenerator 还在为复杂的原神私服命令而烦恼吗&#…...

抖音无水印下载终极指南:3分钟搞定批量下载的完整教程

抖音无水印下载终极指南&#xff1a;3分钟搞定批量下载的完整教程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppo…...

从零搭建到日常调试:一份给新手的 Kafka 命令行操作全流程指南

从零搭建到日常调试&#xff1a;一份给新手的 Kafka 命令行操作全流程指南 第一次接触 Kafka 时&#xff0c;我被它那些晦涩的概念和复杂的命令行参数搞得晕头转向。作为一个从 MySQL 和 Redis 这类传统数据库转过来的开发者&#xff0c;Kafka 的分布式消息队列模型确实需要一些…...

如何在macOS上免费解锁百度网盘SVIP下载限速?终极解决方案

如何在macOS上免费解锁百度网盘SVIP下载限速&#xff1f;终极解决方案 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS BaiduNetdiskPlugin-macOS是一款…...

3小时从零掌握yuzu:在PC上畅玩任天堂Switch游戏的完整指南

3小时从零掌握yuzu&#xff1a;在PC上畅玩任天堂Switch游戏的完整指南 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想在Windows、Linux或Android设备上免费体验任天堂Switch游戏吗&#xff1f;yuzu模拟器正是你…...

深入解析Enso:构建高性能可编程代理与API网关的Go框架

1. 项目概述&#xff1a;一个被低估的“瑞士军刀”如果你在开源社区里混迹过一段时间&#xff0c;大概率见过这样的场景&#xff1a;一个项目仓库&#xff0c;名字起得挺酷&#xff0c;比如“Enso”&#xff0c;简介里写着“一个现代化的代理工具”&#xff0c;但点进去一看&am…...

CSS3 媒体查询完全指南:响应式设计的核心利器

在移动设备种类繁多的今天,一套网页需要在手机、平板、笔记本、大屏显示器上都能呈现出良好的布局与可读性。CSS3 媒体查询(Media Queries) 正是实现这种“一次设计,处处适应”的关键技术。它允许开发者根据设备特性(如视口宽度、屏幕分辨率、方向、色彩能力等)有条件地应…...

保姆级教程:用ADAMS 2023复现人体行走与跌倒仿真(附完整模型参数与源文件)

ADAMS 2023生物力学仿真实战&#xff1a;从人体步态建模到跌倒临界点分析 在工程仿真领域&#xff0c;人体运动动力学一直是极具挑战性的研究方向。ADAMS作为多体动力学仿真软件的标杆&#xff0c;其2023版本在生物力学仿真方面新增了多项实用功能。本文将带您从零开始&#xf…...

当AI开始检测自身缺陷:测试工具失控的风险与应对

在软件测试领域&#xff0c;AI正从辅助工具向核心角色转变。2026年的测试场景中&#xff0c;AI不仅能自动生成测试用例、自我修复失效选择器&#xff0c;还能以人眼精度完成视觉回归检测。这些能力让测试工程师从繁琐的重复劳动中解放出来&#xff0c;将精力聚焦于业务逻辑与边…...

未来企业不是“AI 工具型企业“——是 AI 驱动型企业

关于 AI 驱动型企业的一份构想 一、如果让你从零设计一家公司的技术栈 如果让你从头设计一家公司的技术栈&#xff0c;把 AI 当成核心组件——你会怎么搭&#xff1f; 不是"给现有系统加个 AI 调用"&#xff0c;而是&#xff1a;流程怎么设计、岗位怎么抽象、内部系…...