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

devtools/2024/9/23 3:37:41/

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.ppmy.cn/devtools/19902.html

相关文章

云赛道---AI开发框架

MindSpore 旨在提供端边云全场景的 AI 框架。 MindSpore 可部署于端、边、云不同的 硬件环境&#xff0c;满足不同环境的差异化需求&#xff0c;如支持端侧的轻量化部署&#xff0c;支持云侧丰富的 训练功能如自动微分、混合精度、模型易用编程等。 MindSpore 全场景的几个重…

安全小课堂丨什么是暴力破解?如何防止暴力破解

什么是暴力破解&#xff1f; 暴力破解也可称为穷举法、枚举法&#xff0c;是一种比较流行的密码破译方法&#xff0c;也就是将密码进行一一推算直到找出正确的密码为止。比如一个6位并且全部由数字组成的密码&#xff0c;可能有100万种组合&#xff0c;也就是说最多需要尝试10…

冯唐成事心法笔记 —— 知世

系列文章目录 冯唐成事心法笔记 —— 知己 冯唐成事心法笔记 —— 知人 冯唐成事心法笔记 —— 知世 冯唐成事心法笔记 —— 知智慧 文章目录 系列文章目录PART 3 知世 成事者的自我修养怎样做一个讨人喜欢的人第一&#xff0c;诚心第二&#xff0c;虚心 如何正确看待别人的评…

React vs React Native写法上的不同

标签 <div> -> <View> / <ScrollView><p> -> <Text><input> -> <TextInput><image> -> <Image><button> -> <Button>css background-image -> <ImageBackground> 除此之外还有一…

Linux 安装 JDK

通过 Yum 安装&#xff08;推荐&#xff09; 确保系统包列表是最新的。这将帮助确保安装的是最新版本的软件包。 sudo yum update -y确定要安装哪个 JDK 版本&#xff1a; yum list java*确定 Linux 系统架构&#xff1a; [rootlavm-zzgegfex4j ~]# uname -a Linux lavm-zz…

鸿蒙开发(九)UI实战 - 线性布局实现登录界面

前面我们花了很多章去讲述鸿蒙开发的UI&#xff0c;包括布局和控件等。本篇&#xff0c;我们综合使用布局和控件&#xff0c;完成一个简单的用户登录界面。 一、布局选择 简单回忆下我们掌握的几种布局&#xff0c;线性布局的控件横向或纵向线性排列&#xff0c;非常适合实现登…

未来已来:解锁AGI的无限潜能与挑战

未来已来&#xff1a;解锁AGI的无限潜能与挑战 引言 假设你有一天醒来&#xff0c;发现你的智能手机不仅提醒你今天的日程&#xff0c;还把你昨晚做的那个奇怪的梦解释了一番&#xff0c;并建议你可能需要减少咖啡摄入量——这不是科幻电影的情节&#xff0c;而是人工通用智能…

Docker在Windows与CentOS上的安装

这个季节有着无数的热烈&#xff0c;就像是飞鸟对天空的迫切。大家好&#xff0c;今天给大家分享一下关于Docker的安装&#xff0c;那么作为一名软件测试工程师&#xff0c;为什么需要了解Docker并且使用Docker呢&#xff1f;Docker会给我们带来怎样的好处呢&#xff1f; 原因…