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

算法学习笔记(最短路——Bellman-Ford)

B e l l m a n — F o r d Bellman—Ford BellmanFord是一种单源最短路径算法,可以用于边权为负的图,但是只能用于小图。

大概过程:

  1. 枚举每一条边,更新可以更新的节点(起点到自己距离为 0 0 0,从地点开始向外)。
  2. 重复第一个步骤 n − 1 n - 1 n1次(起点不用),每一轮至少有一个节点会被更新出最短路径(和 D i j k s t r a Dijkstra Dijkstra中用到的贪心思想有点像)。

Dijkstra传送门

算法复杂度:很明显需要 n − 1 n - 1 n1个点都需要枚举一次,每次都需要枚举 m m m条边,复杂度为 O ( n m ) O(nm) O(nm)

同时这个算法还可以判断是否存在负环。只要更新完 n − 1 n - 1 n1次后,还有点可以被更新最短路,那就是存在负环的,因为只有负环是每走一圈路径长度都会往下减,就可以无限更新,而正常图我们只要枚举 n − 1 n - 1 n1遍。

也可以记录每个节点最短路的路径。(前面发过的最短路算法应该也有,可以参考 B e l l m a n F o r d Bellman_Ford BellmanFord的处理办法)

同样的,通过例题理解代码。


【模板】Bellman-Ford算法-StarryCoding | 踏出编程第一步

题目描述

n n n m m m边的带负权有向图(连通,可能存在重边与自环),求 1 1 1到所有点的单源最短路的距离。

保证结点 1 1 1可以到达所有结点。

如果图中存在负环,则只输出一个整数 − 1 −1 1

输入描述

第一行两个整数 n , m 。 ( 2 ≤ n , m ≤ 1 × 1 0 4 ) n, m。(2 \leq n , m \leq 1 \times 10^4) n,m(2n,m1×104)

接下来 m m m行,每行一条单向边 x , y , z x,y,z x,y,z表示存在一条从 x x x y y y的距离为 z z z的通道。 ( 1 ≤ x , y ≤ n , − 1 0 9 ≤ z ≤ 1 0 9 ) (1 \leq x, y \leq n, -10^9 \leq z \leq 10^9) (1x,yn,109z109)

输出描述

一行 n n n个整数,第 i i i个整数表示从点 1 1 1到点 n n n的最短距离。

如果图中存在负环,则只输出一个整数 − 1 −1 1

输入样例1

5 5
1 2 1
2 3 -2
3 4 1
4 5 6
1 5 -5

输出样例1

0 1 -1 0 -5

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 9;
using ll = long long;
const ll inf = 2e18;struct Edge
{int x;ll w;
};int n, m;
vector<Edge> g[N];
ll d[N];
//记录前驱节点,用于打印路径。
// int pre[N];void print(int s, int t)        //打印路径用的
{if(s == t){cout << s << ' ';return;}print(s, pre[t])cout << t << ' ';
}void solve()
{cin >> n >> m;for(int i = 1; i <= m; ++i){int u, v;ll w; cin >> u >> v >> w;g[u].push_back({v, w});}//d[i]表示从起点到点i的距离。for(int i = 1; i <= n; ++i) d[i] = inf;d[1] = 0;bool circle;    //判断负环,最后一次出来之后还是true就是一直在更新,有负环for(int i = 1; i <= n; ++i) //枚举n遍{circle = false;for(int x = 1; x <= n; ++x)     //枚举每天边{for(auto [y, w] : g[x]){if(d[x] + w < d[y])     //如果能更新{d[y] = d[x] + w;// pre[x] = y;  如有需要,记录路径circle = true;}}}}if(circle) cout << "-1" << '\n';else{for(int i = 1; i <= n; ++i) cout << d[i] << ' ';}
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int _ = 1;while(_--) solve();return 0;
}

易错提醒:还是别忘记初始化,别忘记初始化,别忘记初始化。

P S PS PS:这个代码过不了这个例题,数据范围略大,需要优化成 s p f a spfa spfa算法。

相关文章:

算法学习笔记(最短路——Bellman-Ford)

B e l l m a n — F o r d Bellman—Ford Bellman—Ford是一种单源最短路径算法&#xff0c;可以用于边权为负的图&#xff0c;但是只能用于小图。 大概过程&#xff1a; 枚举每一条边&#xff0c;更新可以更新的节点&#xff08;起点到自己距离为 0 0 0&#xff0c;从地点开…...

try-catch-finally的省略与springboot

在 Java 中&#xff0c;try-catch 块是用于捕获和处理异常的结构&#xff0c;它可以帮助您在代码中处理可能发生的异常情况。在某些情况下&#xff0c;您可能希望省略 try-catch 块并将异常向上抛出&#xff0c;让调用者处理异常。这种情况通常适用于以下情况&#xff1a; 方法…...

容器Docker:轻量级虚拟化技术解析

引言 随着云计算和虚拟化技术的飞速发展&#xff0c;容器技术以其轻量级、高效、可移植的特性&#xff0c;逐渐成为了软件开发和部署的新宠。在众多容器技术中&#xff0c;Docker以其简单易用、功能强大的特点&#xff0c;赢得了广泛的关注和应用。本文将全面介绍Docker的基本概…...

windows 系统中cuda 12.1 环境安装

文章目录 1. 安装cuda 12.11.1 下载1.2 安装 cuda1.2.1 安装步骤1.2.2 环境变量安装1.3 安装cuDNN1.3.1 安装1.3.2 cuDNN配置验证2. anaconda 安装2.1 安装2.2 环境变量配置3. 报错解决1. 安装cuda 12.1 首先通过nvidia-smi 查看可以安装的CUDA最高版本...

字节和旷视提出HiDiffusion,无需训练,只需要一行代码就可以提高 SD 生成图像的清晰度和生成速度。代码已开源。

字节和旷视提出HiDiffusion&#xff0c;无需训练&#xff0c;只需要一行代码就可以提高 SD 生成图像的清晰度和生成速度。代码已开源。 支持将图像生成的分辨率提高至40964096&#xff0c;同时将图像生成速度提升1.5至6倍。 支持所有 SD 模型同时也支持 SD 模型的下游模型&…...

linux下dd制作启动U盘

dd命令是比较推荐的一种Linux环境中制作U盘启动盘的方式&#xff0c;无需安装额外的工具&#xff0c;基本上所有Linux发行版都集成了这个命令。 1、插入U盘&#xff1b; 2、打开终端&#xff1b; 3、确认U盘路径&#xff0c;在终端中输入&#xff1a;sudo fdisk -l 例如&am…...

springboot整合mybatis配置多数据源(mysql/oracle)

目录 前言导入依赖坐标创建mysql/oracle数据源配置类MySQLDataSourceConfigOracleDataSourceConfig application.yml配置文件配置mysql/oracle数据源编写Mapper接口编写Book实体类编写测试类 前言 springboot整合mybatis配置多数据源&#xff0c;可以都是mysql数据源&#xff…...

练习项目后端代码解析切面篇(Aspect)

前言 之前注解篇时我说&#xff0c;通常情况下一个自定义注解一般对应一个切面&#xff0c;虽然项目里的切面和注解个数相同&#xff0c;但是好像有一个名字看起来并不对应&#xff0c;无所谓&#xff0c;先看了再说。 ExceptionLogAspect切面 我在里面做了具体注释&#x…...

TypeScript常见面试题第六节

题目二十六:TypeScript 中的装饰器? 一、讲解视频 TS面试题二十六:TypeScript 中的可选链? 二、题目解析 本题目考察可选链的相关知识,可选链是比较新的一个语法,是一种访问嵌套对象属性的安全的方式。即使中间的属性不存在,也不会出现错误。如果可选链 ?. 前面的值为…...

LeetCode 面试经典150题 228.汇总区间

题目&#xff1a; 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区…...

大数据分析入门10分钟快速了解SQL

SQL是什么&#xff1f; SQL全称Structured Query Language(结构化查询语言”) 为什么要用SQL&#xff1f; SQL通用 常见的表格分析操作&#xff0c;Excel也能做&#xff0c;为什么不用呢&#xff1f; 因为处理上亿行大数据时&#xff0c;Excel并不够用。 而常见的大数据引…...

设置多用户远程登录windows server服务器

##设置多用户远程登录windows server服务器 ###1、远程登录windows server 2016 运行—>mstsc—>远程IP地址—>用户和密码 2、远程windows服务器设置多用户策略 运行—>gpedit.msc->计算机配置—管理模板—windows组件—远程桌面服务—远程桌面会话主机----连…...

一文了解栈

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、栈是什么&#xff1f;二、栈的实现思路1.顺序表实现2.单链表实现3.双向链表实现 三、接口函数的实现1.栈的定义2.栈的初始化3.栈的销毁4.入栈5.出栈6.返回栈…...

C语言----汉诺塔问题

1.什么是汉诺塔问题 简单来说&#xff0c;就是有三个柱子&#xff0c;分别为A柱&#xff0c;B柱&#xff0c;C柱。其中A柱从上往下存放着从小到大的圆盘&#xff0c;我们需要借助B柱和C柱&#xff0c;将A柱上的所有圆盘转移到C柱上&#xff0c;并且一次只能移动一个圆盘&#…...

Python中驼峰命名法和下划线命名法相互转换的实战代码

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

【hackmyvm】vivifytech靶机

渗透思路 信息收集端口扫描端口服务信息目录扫描爆破hydra--sshgit提权 信息收集 ┌──(kali㉿kali)-[~] └─$ fping -ag 192.168.9.0/24 2>/dev/null 192.168.9.119 --主机 192.168.9.164 --靶机个人习惯&#xff0c;也方便后续操作&#xff0c;将IP地址赋值给一个变…...

纯血鸿蒙APP实战开发——手写绘制及保存图片

介绍 本示例使用drawing库的Pen和Path结合NodeContainer组件实现手写绘制功能。手写板上完成绘制后&#xff0c;通过调用image库的packToFile和packing接口将手写板的绘制内容保存为图片&#xff0c;并将图片文件保存在应用沙箱路径中。 效果图预览 使用说明 在虚线区域手写…...

在什么情况下表单会被重复提交?如何避免?

表单被重复提交是Web应用中常见的问题&#xff0c;通常在用户提交表单后点击按钮多次&#xff0c;或在表单提交后刷新页面时发生。这可能导致数据的重复处理&#xff0c;比如重复记录或订单。 何时会发生表单重复提交&#xff1f; 用户多次点击提交按钮&#xff1a;在网络延迟…...

JavaScript 中的 Class 类

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f525; 引言&#x1f3af; 基础知识&#x1f3d7;️ 构造函数 (Constructor)&#x1f510; 私有字段 (Private Fields)&#x1f510; 私有方法 (Private Methods)&#x1f9ec; 继承 (Inheritance)&#x1f4e6; 静态…...

python实验三 实现UDP协议、TCP协议进行服务器端与客户端的交互

实验三 实验题目 1、请利用生成器构造一下求阶乘的函数Factorial()&#xff0c;定义一个函数m()&#xff0c;在m()中调用生成器Factorial()生成小于100的阶乘序列存入集合s中&#xff0c;输出s。 【代码】 def factorial():n1f1while 1:​ f * n​ yield (f)​ n1…...

Blender 3MF插件终极指南:如何在Blender中实现3D打印文件的完美导入导出

Blender 3MF插件终极指南&#xff1a;如何在Blender中实现3D打印文件的完美导入导出 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 想要在Blender中高效处理3D打印文件吗…...

从NeoPixel到CircuitPython:打造智能LED眼镜的完整硬件与软件实践

1. 项目概述 如果你对可穿戴电子设备、酷炫的LED光效以及用代码创造物理交互感兴趣&#xff0c;那么这个项目绝对能让你兴奋起来。今天要分享的&#xff0c;是如何亲手制作一副灵感来源于电子音乐人REZZ标志性风格的NeoPixel LED眼镜。这不仅仅是一个简单的焊接和组装教程&…...

基于FONA808与Adafruit IO的实时GPS追踪系统实战

1. 项目概述与核心价值又到了一年一度的万圣节&#xff0c;孩子们最兴奋的“不给糖就捣蛋”活动即将上演。作为一个技术爱好者兼“鸡娃”家长&#xff0c;我每年都在琢磨怎么让这个传统活动变得更有趣、更高效。去年&#xff0c;我儿子抱怨说走了半天路&#xff0c;拿到的糖果却…...

植物树枝叶片果实检测数据集7220张VOC+YOLO格式

植物树枝叶片果实检测数据集7220张VOCYOLO格式数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7220 标注数量(xml文件个数)&#xff1a;7220…...

C8051Fxx系列MCU的Bootloader与ISP功能开发指南

1. C8051Fxx系列MCU的Bootloader与ISP功能概述在嵌入式系统开发中&#xff0c;C8051Fxx系列微控制器因其高性能和丰富的外设资源被广泛应用于工业控制、消费电子等领域。Bootloader&#xff08;引导加载程序&#xff09;和ISP&#xff08;在系统编程&#xff09;功能是这类MCU开…...

Android 11 热点永不关闭的三种实现方案:从源码修改到API调用

Android 11热点持久化方案深度解析&#xff1a;从系统底层到应用层的完整实现 在移动设备开发领域&#xff0c;热点功能的稳定性与持久性一直是开发者关注的重点。Android 11系统默认的热点超时机制&#xff08;10分钟无连接自动关闭&#xff09;虽然考虑了节能因素&#xff0c…...

【免费下载】 最靠谱的Cadence Allegro PCB SI 板级仿真教程

最靠谱的Cadence Allegro PCB SI 板级仿真教程 【下载地址】最靠谱的CadenceAllegroPCBSI板级仿真教程 最靠谱的Cadence Allegro PCB SI 板级仿真教程欢迎来到“最靠谱的Cadence Allegro PCB SI 板级仿真教程”资源页面 项目地址: https://gitcode.com/open-source-toolkit/e…...

2025年知识竞赛行业趋势报告:智能化、场景化与生态融合

&#x1f4ca; 2025年知识竞赛行业趋势报告技术更智能 场景更融合 内容更鲜活 工具更普惠&#x1f680; 引言&#xff1a;变革中的竞赛生态知识竞赛&#xff0c;这一古老的知识检验与娱乐形式&#xff0c;在数字技术的持续赋能下&#xff0c;正经历着一场深刻的范式变革。从…...

【ElevenLabs企业级克隆部署白皮书】:单模型支持12种语境情绪、延迟<480ms、通过GDPR+CCPA双认证

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs企业级语音克隆技术全景概览 ElevenLabs 企业级语音克隆技术以高保真度、低延迟和强可控性为核心&#xff0c;面向金融客服、跨国培训、无障碍内容生成等关键业务场景提供端到端语音合成解决…...

保姆级教程:用VMware Workstation Pro 16给虚拟机装Win11,手把手教你用Ghost镜像(含UEFI/BIOS切换避坑)

VMware Workstation Pro 16实战&#xff1a;零基础Ghost安装Windows 11全流程解析 在虚拟化技术日益普及的今天&#xff0c;使用VMware Workstation Pro创建虚拟机已成为开发者测试新系统的首选方案。特别是对于Windows 11这样的新操作系统&#xff0c;直接在物理机上安装可能存…...