最短路问题之Bellman-Ford,SPFA算法,例题 负环

Bellman-Ford算法:

Bellman-Ford算法用于解决带有负权边的单源最短路径问题。其基本思想是通过不断地松弛边来逐步求解最短路径。算法的主要步骤如下:

  1. 初始化:将源点到各个顶点的距离初始化为无穷大,源点的距离初始化为0。
  2. 重复更新:重复执行以下步骤|V|-1次(其中|V|是顶点的数量):
    • 对于图中的每条边(u, v),尝试以当前最短路径长度到达顶点v,如果从源点s经过u再到v的路径长度更短,则更新v的最短路径长度为s到u的最短路径长度加上(u, v)的权值。
  3. 检测负权回路:检查所有边,如果在第|V|次松弛操作后,仍然存在顶点的最短路径长度可以继续减小,则说明存在负权回路。

Bellman-Ford算法的时间复杂度为O(|V| * |E|),其中|V|是顶点的数量,|E|是边的数量。

SPFA算法(Shortest Path Faster Algorithm):

SPFA算法是一种改进的最短路径算法,类似于Bellman-Ford算法,但是在实际应用中通常运行得更快。其基本思想是使用队列来保存待更新的顶点,并通过只对需要更新的顶点进行松弛操作来减少不必要的计算。算法的主要步骤如下:

  1. 初始化:将源点加入队列,并将源点到各个顶点的距离初始化为无穷大,源点的距离初始化为0。
  2. 重复更新:从队列中取出一个顶点u,遍历与u相邻的所有顶点v:
    • 如果以u为中介点,可以使得源点s到v的路径长度更短,则更新v的最短路径长度为s到u的最短路径长度加上(u, v)的权值,并将v加入队列。
  3. 重复步骤2,直到队列为空。

SPFA算法在最坏情况下的时间复杂度是O(|V| * |E|),但是在平均情况下通常运行得更快,特别是在稀疏图中。

洛谷 P3385 负环

AC code

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
vector<PII> vv[3010];
int T;
int n,m;
int u,v,w;
queue<int> q;
int d[2010];
int vis[2010];
int cnt[2010];inline bool spfa(){memset(d,0x3f,sizeof d);memset(vis,0,sizeof vis);memset(cnt,0,sizeof cnt);d[1]=0;q.push(1);vis[1]=1;while(q.size()){int t=q.front();q.pop();vis[t]=0;for(auto ed:vv[t]){int a=ed.first,b=ed.second;if(d[a]>d[t]+b){d[a]=d[t]+b;cnt[a]=cnt[t]+1;if(cnt[a]>=n) return true;判断负环if(!vis[a]) q.push(a),vis[a]=1;}} }return false;
}int main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>T;while(T--){cin>>n>>m;for(int i=0;i<m;i++){cin>>u>>v>>w;if(w>=0) vv[u].push_back({v,w}),vv[v].push_back({u,w});else vv[u].push_back({v,w});}if(spfa()) cout<<"YES"<<endl;else cout<<"NO"<<endl;for(int i=1;i<=n;i++) vv[i].clear();}return 0;
} 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux使用Libevent库实现一个网页服务器---C语言程序

Web服务器 这一个库的实现 其他的知识都是这一个专栏里面的文章 实际使用 编译的时候需要有一个libevent库 gcc httpserv.c -o httpserv -levent实际使用的时候需要指定端口以及共享的目录 ./httpserv 80 .这一个函数会吧这一个文件夹下面的所有文件共享出去 实际的效果, 这…

关于电商独立站搭建中电商API数据采集接口的应用

搭建供应链系统时&#xff0c;您可能需要与电商平台进行集成&#xff0c;以实现订单管理、库存同步、物流跟踪等功能。以下是一些常见的电商接口&#xff0c;可以帮助您构建供应链系统&#xff1a; 1. **淘宝开放平台接口**&#xff1a;淘宝开放平台提供了丰富的接口&#xff…

【VSLAM】VINO-Mono安装部署与运行

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍VINO-Mono安装部署与运行。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷…

【超级简单】vscode进入服务器的docker容器

前提 1、已经运行docker容器 2、已经用vscode链接服务器 在vscode中安装的插件 Dev Containers docker 在容器中安装的依赖 yum install openssh-server yum install openssh-clientsvscode进入服务器的docker容器 找到自己的容器&#xff0c;右键点击&#xff0c;找到…

【状态压缩 并集查找 图论】2157. 字符串分组

本文涉及知识点 状态压缩 并集查找 图论 LeetCode2157. 字符串分组 给你一个下标从 0 开始的字符串数组 words 。每个字符串都只包含 小写英文字母 。words 中任意一个子串中&#xff0c;每个字母都至多只出现一次。 如果通过以下操作之一&#xff0c;我们可以从 s1 的字母集…

强固型工业电脑在称重系统+叉车电脑,称重量体扫码一体机,物流分拣线工作站行业应用

称重系统叉车电脑行业应用 背景介绍 在叉车上安装称重传感器&#xff0c;通过对举升压力的自动检测&#xff0c;将压力信号转换为电流或电压信号&#xff0c;经过A/D转换&#xff0c;使模拟信号变为数字信号&#xff0c;经微处理器进行数据处理后通过蓝牙、串口或者USB接口将称…

【AI自媒体制作】【AI工具】Midjourney中文站

Midjourney Midjourney中文站, MJ中文站 - 专业AI绘图网站 广场 绘画广场&#xff1a; 包含大量其他用户生成好的图片&#xff0c;可以自由保存。 视频广场&#xff1a; 普通用户目前只支持查看&#xff0c;无法下载 画夹广场&#xff1a; 有很多免费的画夹&#xff0c;比…

(1)认识人工智能

第一章 认识人工智能 引言 本人目前大三&#xff0c;双非一本的人工智能专业&#xff0c;代码能力不算太差&#xff0c;做过项目&#xff0c;也打了比赛&#xff0c;获了奖&#xff0c;但是走技术路线总会有否定自己的感觉&#xff0c;可能是感觉自己的才能没有在搞技术方面实…

Nacos注册中心实战

注册中心实战 1.快速使用1.1 版本选择1.2 父pom1.3 nacos-client pom1.4 nacos-client bootstrap.yaml配置 2.常用配置3.Nacos Server环境搭建3.1 单机模式启动3.1.1 解压&#xff0c;进入nacos目录 进入bin目录下&#xff0c;编辑startup.cmd脚本&#xff0c; 设置启动模式为单…

数据仓库作业五:第8章 关联规则挖掘

目录 第8章 关联规则挖掘作业题 第8章 关联规则挖掘 作业题 1、设4-项集 X { a , b , c , d } X\{a,b,c,d\} X{a,b,c,d}&#xff0c;试求出由 X X X 导出的所有关联规则。 解&#xff1a; 首先生成项集的所有非空真子集。这包括&#xff1a; { a } , { b } , { c } , {…

vivado 在波形查看器中查看 ILA 探针数据

在波形查看器中查看 ILA 探针数据 Vivado 集成设计环境 (IDE) 中的“ ILA 波形查看器 (ILA waveform viewer) ”提供了一种强大的方法 &#xff0c; 可分析从 ILA 调 试核采集的数据。成功触发 ILA 核并采集数据后 &#xff0c; Vivado 会以从 ILA 核收集的数据自动填…

solidity入门

Solidity 是以太坊智能合约开发的主要编程语言&#xff0c;支持多种数据类型&#xff0c;其中数组是一种非常常用和灵活的数据结构。在本教程中&#xff0c;我们将深入探讨 Solidity 中数组的各种类型、创建规则以及常见操作。 ### 固定长度数组 固定长度数组在声明时指定了数…