bellman-ford——AcWing 853. 有边数限制的最短路99

bellman-ford

定义

贝尔曼-福特(Bellman-Ford)算法是一种用于在加权有向图中计算单源最短路径的算法。

运用情况

  • 可以处理存在负权边的图。
  • 常用于找出图中从一个特定顶点到其他所有顶点的最短路径。

注意事项

  • 时间复杂度相对较高。
  • 如果图中包含从源点可达的负权循环,则算法无法得出正确结果。

解题思路

它通过对所有的边进行松弛操作,不断更新源点到各个顶点的最短距离估计值。具体步骤如下:

  1. 初始化所有顶点的距离为无穷大(除了源点距离为 0)。
  2. 进行多次迭代,对每一条边进行松弛操作。
  3. 检查是否在迭代后还有边可以被松弛,如果没有,则算法结束,得到最短路径。

例如,有一个图,顶点 A 为源点,边的权值分别为 AB=5,AC=3,BC=-2,通过贝尔曼-福特算法逐步迭代松弛边,可以最终确定从 A 到其他顶点的最短路径。

其他计算最短路径的算法

迪杰斯特拉(Dijkstra)算法

  • 用于在加权有向图或无向图中计算单源最短路径,但不能处理负权边。
  • 它通过维护一个顶点的集合,逐步确定到各个顶点的最短距离。

弗洛伊德(Floyd)算法

  • 可以计算任意两点之间的最短路径。
  • 通过动态规划的思想,不断更新两点之间经过中间顶点的最短距离。

A*算法

  • 常用于在有启发信息的图中寻找最优路径。
  • 结合了贪心算法和迪杰斯特拉算法的一些特点。

例如,在一个交通网络中,可以使用迪杰斯特拉算法找到从一个城市到其他城市的最短驾车路径;在一个电路板布线的问题中,可能会用到弗洛伊德算法来确定各个节点之间的最优布线;而在游戏中的寻路问题中,A*算法常常被采用。

AcWing 853. 有边数限制的最短路 

题目描述

853. 有边数限制的最短路 - AcWing题库

运行代码

#include<iostream>
#include<cstring>
using namespace std;
const int N = 510, M = 10010;
struct Edge {int a;int b;int w;
} e[M];//把每个边保存下来即可
int dist[N];
int back[N];//备份数组防止串联
int n, m, k;//k代表最短路径最多包涵k条边
int bellman_ford() {memset(dist, 0x3f, sizeof dist);dist[1] = 0;for (int i = 0; i < k; i++) {//k次循环memcpy(back, dist, sizeof dist);for (int j = 0; j < m; j++) {//遍历所有边int a = e[j].a, b = e[j].b, w = e[j].w;dist[b] = min(dist[b], back[a] + w);//使用backup:避免给a更新后立马更新b, 这样b一次性最短路径就多了两条边出来}}if (dist[n] > 0x3f3f3f3f / 2) return 0x3f3f3f3f;else return dist[n];
}
int main() {scanf("%d%d%d", &n, &m, &k);for (int i = 0; i < m; i++) {int a, b, w;scanf("%d%d%d", &a, &b, &w);e[i] = {a, b, w};}int res = bellman_ford();if (res == 0x3f3f3f3f) puts("impossible");else cout << res;return 0;
}

代码思路

  1. 引入头文件<iostream><cstring>分别用于输入输出和内存操作(如memset)。
  2. 命名空间:使用using namespace std;来避免频繁地书写std::前缀。
  3. 常量定义N = 510M = 10010为节点和边的最大数量,用于数组尺寸。
  4. 结构体Edge:定义边的结构,包含起点a、终点b和权重w
  5. bellman_ford函数:实现最短路径算法的核心逻辑。
    • 初始化:用memset将所有节点的最短距离初始化为一个很大的数0x3f3f3f3f,表示无穷大,起点dist[1]初始化为0。
    • 迭代k次:循环k次,每次循环都尝试通过添加一条边来更新路径。
    • 备份距离:使用back数组备份上一轮的最短距离,以避免路径通过同一个点超过k次,确保不超过k条边的限制。
    • 边的遍历:在每次迭代中,遍历所有边,如果通过当前边可以到达一个更短的路径,则更新dist[b]
    • 检查负环:若结束时dist[n]仍为无穷大,说明没有满足条件的路径,返回0x3f3f3f3f
  6. 主函数逻辑

  • 读取输入:读取节点数n、边数m和最短路径的最大边数限制k
  • 构建边集合:读取每条边的信息并存储到结构体数组e中。
  • 调用bellman_ford:计算从节点1到节点n的满足条件的最短路径长度。
  • 输出结果:根据计算结果输出最短路径长度,若为0x3f3f3f3f则输出"impossible",表示没有满足条件的路径。

特别说明

  • 此代码中,Bellman-Ford算法通常用于检测负权边的最短路径,但在这里做了修改以适应特定限制(最短路径最多包含k条边)。需要注意的是,原始的Bellman-Ford算法通常需要进行n-1次迭代来确保找到所有节点的最短路径,但因为这里加入了额外的限制条件(路径长度上限k),所以迭代次数被限制为k次。
  • 由于限制了最短路径的边数,该算法不能保证在存在负权环的情况下仍然正确,这是对传统Bellman-Ford算法应用场景的一种特殊化处理。

改进思路

  • 1.路径长度精确控制
  • 明确限制条件的处理:当前代码通过迭代k次来尝试限制路径中的边数,但这并不能严格保证路径恰好包含k条边,只是确保不会超过k条。如果题目要求严格控制边数为k,则需要在更新距离时,检查当前路径是否刚好为k条边,若超过则不更新距离。
  • 2.优化存储结构
  • 邻接表:对于边数较多的情况,使用邻接矩阵(当前隐式使用)可能导致大量空间浪费。可以改为邻接表来存储图,降低空间复杂度,尤其当图稀疏时效果更明显。
  • 3.剪枝优化
  • 提前终止:在每轮迭代中,如果发现没有距离更新发生,说明已经找到了最优解,可以提前终止循环。
  • 起点到终点直接路径:在开始算法之前,检查是否有直接从起点到终点的边,如果有且边数符合限制,这可能是最优解。
  • 4.动态规划与状态压缩
  • 空间优化:考虑到k较小,可以使用动态规划配合状态压缩技术来减少空间使用。例如,可以用三维数组或滚动数组记录到达每个节点且路径长度为1到k的最短距离。
  • 5. 可读性和模块化

  • 函数分解:将读取输入、打印输出等功能拆分为单独的函数,提高代码的模块化和可读性。
  • 注释完善:在关键步骤和逻辑处理处添加详细注释,便于他人阅读和理解代码意图。
  • 6. 错误处理和边界条件检查

  • 输入验证:在读取输入时增加合法性检查,比如检查节点编号是否在有效范围内,边的权重是否合理等。
  • 输出优化:对于特殊情况,如无可达路径或输入数据非法,可以提供更友好的错误提示信息。
  • 7. 使用现代C++特性

  • 智能指针和容器:如果涉及动态内存管理,考虑使用智能指针(如std::unique_ptr)来自动管理内存。对于数据结构,可以探索使用更高级的STL容器,如std::unordered_map来加速边的查找。

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

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

相关文章

计算机毕业设计Django+Vue.js考研推荐系统 考研分数线预测 中公考研爬虫 混合神经网络推荐算法 考研可视化 机器学习 深度学习 大数据毕业设计

Python数据分析与可视化期末项目报告 项目名称&#xff1a; 考研推荐系统数据分析与可视化 学 号&#xff1a; 姓 名&#xff1a; …

【PHP开发工程师系统性教学】——thinkPHP的分页操作,不管有几页,用这个你想分几页就分几页

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

MoneyPrinterPlus:AI自动短视频生成工具,详细使用教程

MoneyPrinterPlus是一款使用AI大模型技术,一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上的轻松赚钱工具。 之前有出过一期基本的介绍&#xff0c;但是后台收到有些小伙伴说&#xff0c;不知道如何使用。 今天我将会手把手的详细介绍…

怎么加密U盘数据?U盘加密软件哪个好?

U盘是我们在生活和工作中最常用的移动存储设备&#xff0c;而为了避免U盘数据泄露&#xff0c;我们需要使用U盘加密软件来加密保护U盘数据。那么&#xff0c;U盘加密软件哪个好呢&#xff1f;下面我们就一起来了解一下吧。 BitLocker加密 BitLocker是Windows系统提供的磁盘加密…

多种传感器在钢铁工业安全风险监测预警中的应用

中国作为钢铁行业的生产与消费大国&#xff0c;其钢铁冶炼流程的复杂性和长周期性使得各环节中频繁出现的有毒有害、易燃易爆气体以及粉尘等危险物质成为行业安全管理的重大挑战。为了保障工作人员的安全&#xff0c;多种传感器在安全风险监测预警中的应用显得尤为重要。 钢铁产…

java从红外图片提取温度,计算超过阈值的温度占总面积的百分比

灰度图是单通道图&#xff0c;像素只有一个值&#xff1a;灰度值。灰度值越高&#xff0c;则图像越亮。 现在我们已经知道我们看到一张灰度图是由许多不同灰度值的像素点构成&#xff0c;而每个像素就是一个越亮的像素&#xff0c;灰度值越高&#xff0c;最高值是255&#xff…

Latex的参考文献中显示三个问号???——解决办法

1、问题描述 在使用spring模板&#xff0c;并引用book时&#xff0c;末尾的引文地方出现三个???由于使用的bibtex是直接从谷歌学术中导出来的&#xff0c;其中仅包含作者&#xff0c;书名&#xff0c;出版社&#xff0c;年份等&#xff0c;缺少了重要的信息。结果导致在出版…

什么!没有Starter的阿里云OSS也能集成到SpringBoot?

实际上&#xff0c;我们在Maven存储库中尝试搜索阿里云OSS。在此过程中&#xff0c;我们会发现阿里云官方未提供一种集成Spring Boot的模式&#xff0c;即xxx-Springboot-Starter&#xff0c;显然&#xff0c;这是一个需要自行定制的组件。然而&#xff0c;如今许多企业在研发过…

LeetCode | 520.检测大写字母

这道题直接分3种情况讨论&#xff1a;1、全部都为大写&#xff1b;2、全部都为小写&#xff1b;3、首字母大写其余小写。这里我借用了一个全是大写字母的串和一个全为小写字母的串进行比较 class Solution(object):def detectCapitalUse(self, word):""":type …

【机器学习】计算机图形和深度学习模型NeRF详解(1)

1.引言 1.1.1. NeRF研究的背景 人们在拍照的时候&#xff0c;往往会中各个角度进行拍摄&#xff0c;以呈现出物体的全貌和美丽。下图的照片&#xff0c;拍摄的是一架楼梯&#xff0c;但是拍摄的角度完全不同&#xff1a; 我们可以看到这些图片都是楼梯的照片&#xff0c;但拍…

Training language models to follow instructions with human feedback 论文阅读

论文原文&#xff1a;https://arxiv.org/pdf/2203.02155 论文简介 语言模型越大并不意味着它能更好的理解用户的意图&#xff0c;因此在这篇论文中&#xff0c;展示了根据人的反馈对模型进行微调&#xff0c;使得语言模型能够在各种人物上更好的理解用户的意图。在评估中&…

树莓派4B学习笔记11:PC端网线SSH连接树莓派

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 今日学习使用网线连接树莓派&#xff0c;网线可以提供更…

使用 C# 学习面向对象编程:第 8 部分

抽象方法 亲爱的读者&#xff0c;本文是 OOP 的第四大支柱&#xff0c;也是最后一大支柱。对于 OOP 初学者来说&#xff0c;这很容易让人困惑。因此&#xff0c;我们用非常简单的语言提供了一个示例。 “抽象用于管理复杂性。无法创建抽象类的对象。抽象类用于继承。” 例如…

降噪领夹麦克风哪个牌子好?揭秘无线领夹麦克风哪个降噪好

相信很多新手视频创作者都有一个疑问&#xff1a;为什么别人的视频或者直播音质这么清晰&#xff0c;几乎没什么噪音呢&#xff1f;其实最主要的就是麦克风的原因&#xff0c;相机或手机内置的麦克风是无法提供高质量的音频记录以及很好的指向性的。 想要拍摄出来的视频作品拥有…

每一个男人都曾有一个机器人的梦想

每一个男人都曾有一个机器人的梦想 我也有 每一个男人都曾有一个机器人的梦想。对于我来说&#xff0c;这个梦想始于童年时代&#xff0c;那时变形金刚风靡一时&#xff0c;几乎所有80后的孩子都为之疯狂。我是80后中的一员&#xff0c;那时候的科技还远没有如今这般发达&#…

《现代通信原理与技术》码间串扰和​​​​​​​无码间串扰的眼图对比实验报告

实 验&#xff1a;码间串扰和无码间串扰的眼图对比实验报告 摘 要&#xff1a; 在数字通信系统中&#xff0c;码间串扰&#xff08;Inter-Symbol Interference, ISI&#xff09;是影响信号质量和系统性能的重要因素之一。本实验通过MATLAB软件生成并对比了受码间串扰影响和未…

华为昇腾异构计算架构CANN及AI芯片简介

异构计算架构CANN 异构计算架构CANN&#xff08;Compute Architecture for Neural Networks&#xff09;是华为针对AI场景推出的异构计算架构&#xff0c;向上支持多种AI框架&#xff0c;包括MindSpore、PyTorch、TensorFlow等&#xff0c;向下服务AI处理器与编程&#xff0c;…

Open To Buy(OTB)计划:零售业者的库存管理利器

在当今快速变化的服装市场中&#xff0c;如何高效、精准地进行商品管理成为了服装企业竞争的关键。OTB&#xff08;Open-to-Buy&#xff09;作为一种有效的商品管理方法&#xff0c;在企业管理中扮演着至关重要的角色。它基于预算、商品计划以及市场需求等多维度因素&#xff0…

Android开发系列(二)Jetpack Compose 之Text控件

Jetpack Compose是一种全新的声明式UI框架&#xff0c;用于构建Android应用程序。Jetpack Compose Text控件是Compose中用于显示文本的基本UI组件。 Text是一个可组合函数&#xff0c;函数声明如下所示。 Composable fun Text(text: String,modifier: Modifier Modifier,colo…

AGI 远不止 ChatGPT!一文入门 AGI 通识及应用开发

AI 大语言模型进入爆发阶段 2022 年 12 月 ChatGPT 突然爆火&#xff0c;原因是其表现出来的智能化已经远远突破了我们的常规认知。虽然其呈现在使用者面前仅仅只是一个简单的对话问答形式&#xff0c;但是它的内容化水平非常强大&#xff0c;甚至在某些方面已经超过人类了&am…