Bellman-Ford算法

初步了解

Bellman-Ford算法是一种用于寻找带有负权边的图中的单源最短路径的算法。它可以处理一般的图,包括存在负权边和负权环的情况。

以下是Bellman-Ford算法的基本思想和步骤:

  • 初始化:将源节点的距离设置为0,将所有其他节点的距离设置为无穷大(或一个很大的数)。

  • 进行松弛操作:对图中的每条边进行一轮松弛操作。松弛操作是指通过检查是否存在一条更短路径来更新节点的距离值。

  • 重复进行步骤2:重复进行|V|-1次松弛操作,其中|V|是图中节点的数量。这是为了确保所有可能的最短路径都被考虑到。

  • 检测负权环:如果在进行第|V|-1次松弛操作后,仍然存在可以被进一步松弛的边,那么说明图中存在负权环。在这种情况下,Bellman-Ford算法无法得出正确的最短路径。

  • 输出结果:如果不存在负权环,则最终的距离值就是源节点到每个节点的最短路径长度。

Bellman-Ford算法的时间复杂度为O(|V| * |E|),其中|V|是节点数,|E|是边数。它可以处理负权边,但是在图中存在负权环的情况下,算法将无法收敛。

负权环是指在图中存在一个环路,其中环路上的边的权重之和为负值。换句话说,如果从起点沿着环路走一圈回到起点,所经过的边的权重之和是负数。
在最短路径算法中,负权环是一个问题,因为它会导致无限循环的情况。当存在负权环时,最短路径就没有意义,因为可以通过无限次地绕着负权环来获得更小的路径长度。
猜想一下,如果一个回路下来权值是一个负值,那么多绕几圈权值越来越小,这样就不存在最短路径

注意了解为什么经过|V| - 1 次操作后仍然可以被进一步松弛的边那么说明图中存在负权环?
在一个没有负权环的图中,最短路径的长度最多包含|V|-1条边。而当存在负权环时,路径可以无限地绕着负权环循环,从而使路径的长度无限减小。

正式了解

我们来看看代码实现

#include <iostream>
#include <vector>
#include <limits>struct Edge {int source;int destination;int weight;
};void BellmanFord(const std::vector<Edge>& edges, int numVertices, int source) {std::vector<int> distance(numVertices, std::numeric_limits<int>::max());std::vector<int> predecessor(numVertices, -1);distance[source] = 0;// 进行|V|-1次松弛操作for (int i = 1; i <= numVertices - 1; ++i) {for (const auto& edge : edges) {if (distance[edge.source] != std::numeric_limits<int>::max() &&distance[edge.source] + edge.weight < distance[edge.destination]) {distance[edge.destination] = distance[edge.source] + edge.weight;predecessor[edge.destination] = edge.source;}}}// 检测负权环for (const auto& edge : edges) {if (distance[edge.source] != std::numeric_limits<int>::max() &&distance[edge.source] + edge.weight < distance[edge.destination]) {std::cout << "图中存在负权环" << std::endl;return;}}// 输出最短路径std::cout << "节点\t距离\t路径" << std::endl;for (int i = 0; i < numVertices; ++i) {std::cout << i << "\t" << distance[i] << "\t";std::vector<int> path;int current = i;while (current != source) {path.push_back(current);current = predecessor[current];}path.push_back(source);for (int j = path.size() - 1; j >= 0; --j) {std::cout << path[j] << " ";}std::cout << std::endl;}
}int main() {int numVertices = 5;std::vector<Edge> edges = {{0, 1, -1},{0, 2, 4},{1, 2, 3},{1, 3, 2},{1, 4, 2},{3, 2, 5},{3, 1, 1},{4, 3, -3}};int source = 0;BellmanFord(edges, numVertices, source);return 0;
}

代码还是比较好理解的

当实现 Bellman-Ford 算法时,我们的目标是计算从给定源节点到图中所有其他节点的最短路径。下面是代码实现的总体思路:

定义一个结构体 Edge 来表示图的边。它包含三个属性:源节点 source、目标节点 destination 和边的权重 weight。

BellmanFord 函数接受边的列表 edges、节点数量 numVertices 和源节点 source 作为输入参数。

初始化两个数组:distance 和 predecessor,分别用于存储从源节点到每个节点的距离和前驱节点。

将 distance 数组中除了源节点之外的所有元素初始化为无穷大,表示初始状态下到达这些节点的距离都是无穷大。将 predecessor 数组中所有元素初始化为 -1,表示初始状态下这些节点没有前驱节点。

进行 numVertices - 1 次松弛操作。每次循环遍历边的列表,对每条边进行松弛操作。如果发现从源节点出发经过当前边到达目标节点的路径比已知的最短路径更短,则更新 distance 数组和 predecessor 数组。

完成 numVertices - 1 次松弛操作后,检查是否存在负权环。遍历边的列表,再次进行一次松弛操作。如果发现存在从源节点出发经过当前边到达目标节点的路径比已知的最短路径更短,则说明图中存在负权环。

最后,输出最短路径的结果。遍历每个节点,打印节点的索引、从源节点到该节点的最短距离以及完整的最短路径。使用 predecessor 数组回溯每个节点的前驱节点,构建完整的路径。

这个实现思路遵循了 Bellman-Ford 算法的基本步骤,首先进行多次松弛操作以计算最短路径,然后检测负权环来判断是否存在无限缩小路径的可能性。最后,通过回溯前驱节点来构建最短路径。

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

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

相关文章

Hook+jsdom 解决cookie逆向

前言 记录下如何破cookie逆向 目标 目标网址:https://q.10jqka.com.cn/ 目标接口:http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/2/ajax/1/ 对抗:cookie反爬虫处理,关键字v,如图 解决步骤 1、JS中关键字查找 如上,我们找到了关键字 v,…

为何设计师都在用这个原型样机资源网站?

谈论原型样机素材模板&#xff0c;这个话题对设计师来说如同老朋友一般熟悉。设计师们在创作完毕后&#xff0c;为了更淋漓尽致地展示他们的设计成果&#xff0c;通常会将其放置在真实的样机素材模板中。这种原型样机素材可以让设计作品迅速且清晰地呈现在真实环境中。找到一个…

(5秒解决)ImportError: attempted relative import with no known parent package

寻找了很多方法&#xff0c;发现大家把事情讲的复杂了。我这里用最简单的办法来解决父包引用找不到的问题。 报错提示&#xff1a;ImportError: attempted relative import with no known parent package 先给大家看看我的目录结构&#xff0c;model.py和test目录在同一级。tra…

前端数组方法汇总集锦

前言 数组主要使用场景有&#xff1a; 存储和处理数据&#xff1a;数组是一种有序的数据结构&#xff0c;可以用来存储和处理多个相关的数据。在前端开发中&#xff0c;我们经常使用数组来存储和处理列表、表格、选项等数据。 循环和遍历&#xff1a;数组提供了循环和遍历的功能…

Android12:内置第三方应用,权限控制器已停止运行,应用app已停止运行

1.设备先安装我提供的app【EasyControler】 2.设备--设置--关于手机--版本号(滑动到最下方)---连续点击六下打开 开发者模式 3.设置--系统--开发者模式--开发者选项 --打开usb调试 4.设置--安全设备管理应用--easycontrol的开关打开 5.将设备连接电脑 打开cmd命令框 输入指令…

smartsofthelp 7.0 最简单的代码生成器

这是一款值得开发人员认真研究的软件 https://pan.baidu.com/s/1xjDL5QypcRJ5neulUPFmWQ?pwdgedx 1.查询数据库死锁相关信息 2.查看数据库的链接情况 3.当前实例上的所有用户 4.创建数据库独立密码 5.查看数据库使用的端口号 6.当前数据库设置的最大连接数 7.当前数据库最大的…

C语言运算符优先级表

C语言运算符优先级表 运算符优先级与结合性 优先级运算符描述结合性1&#xff0c;--后缀自增&#xff0c;自减从左往右()函数调用[]数组下标.结构体与联合体访问成员->结构体与联合体通过指针访问成员(type){list}复合字面量(C99)2&#xff0c;--前缀自增&#xff0c;自减从…

淡入淡出transition: right 1s

transition: right 1s; //重点直接改变right值 操作过快 这里用该方法实现1s内淡入淡出 达到效果目标

JS PromiseLike 的判定与使用

目录 一. $.ajax()返回值遇到的问题二. Promise A 规范三. 判断是否为PromiseLike3.1 判断ES6的new Promise()3.2 判断包含then方法的对象3.3 判断$.ajax()返回的对象 一. $.ajax()返回值遇到的问题 当我们执行如下js代码时&#xff0c;可以看到$.ajax()执行后&#xff0c;得到…

Linux python安装 虚拟环境 virtualenv

根目录创建 venvs 文件夹 sudo mkdir /venvs 进入 /venvs 目录 cd /venvsp 创建虚拟环境&#xff0c;前提要按照 python3 安装 的 命令 sudo apt install python3 sudo python3 -m venv 虚拟环境名 激活虚拟环境 sourcepippip /venvs/zen-venv/bin/activatepinpi 安装flask pip…

【C语言】深入解开指针(四)

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

centos7上用docker部署mysql 5.7,并解决中文乱码问题

1. 安装docker 查看这篇文章的前半部分即可&#xff1a; 虚拟机上安装docker&#xff0c;并安装flink镜像 2. 安装mysql 5.7 2.1 下载mysql镜像 可以使用docker search mysql命令查看远程镜像仓库中的镜像信息&#xff0c;或者访问dockerhub去找需要的镜像 这里直接拉取镜像…

ubuntu借助overlay方案实现重启自动还原

配置重启还原OS 首先&#xff1a;sudo apt install overlayroot 安装一下软件 然后编辑配置文件&#xff1a;/etc/overlayroot.conf * overlayroottmpfs or overlayroottmpfs:PARAMETERS write all changes to a temporary (ram only) backing device A tmpfs mount will …

ubuntu22.04安装wvp-gb28181-pro 2023-11-23最新版本(一键安装)

下载程序 输入下面命令&#xff0c;输入普通用户密码&#xff0c;切换到 root用户 sudo su git clone -b ubuntu_wvp_online_install_2023_0425 https://gitcode.net/zenglg/ubuntu_wvp_online_install.git 等待下载完成 安装 进入到克隆下来的路径中 cd /home/tuners/ub…

万界星空科技低代码云MES系统

所谓“云MES”&#xff0c;它是基于MES管理云平台储存大数据运算而来&#xff0c;区别于一般管理系统&#xff0c;云MES操作运行不需要独立的服务器去储存和运行&#xff0c;而是通过云端进行数据、储存、运行&#xff0c;最后将计算完的数据在MES系统上呈现&#xff0c;呈现端…

让国内AI模型解题:滑动窗口中找出最大值,文心一言,通义千问错误率100%,讯飞星火略胜一筹

最近&#xff0c;一些大厂陆续放出了自己的AI模型&#xff0c;处于日常的使用和准确度&#xff0c;我通过一道试题来看一下文心一言、讯飞星火和通义千万的回答结果 本道题是一道很经典的算法题&#xff0c;请在滑动窗口中找出最大值 文心一言 第一次给出答案 package main…

vue中v-if与v-for的优先级?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue中v-if与v-for的优先级? 目录 v-if和v-for的优先级是什么&#xff1f; 一、作用 二、优先级…

移动机器人,开启智能柔性制造新篇章

智能制造是当今工业发展的必然趋势&#xff0c;而柔性制造则是智能制造的重要组成部分。在这个快速变革的时代&#xff0c;如何提高生产效率、降低成本、增强灵活性成为了制造业的关键挑战。富唯智能移动机器人应运而生&#xff0c;为柔性制造注入了新的活力。 基于富唯智能AI-…

凸问题与非凸问题

凸函数&#xff1a;曲线上任意两点连线上的点对应的函数值不大于该两点对应的函数值得连线上的值&#xff0c;例如yx^2&#xff1b; 非凸函数&#xff1a;曲线上任意两点连线上的点对应的函数值既有大于该两点对应的函数值得连线上的值的部分也有小于的部分&#xff0c;例如&am…

Re51:读论文 Language Models as Knowledge Bases?

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;Language Models as Knowledge Bases? ArXiv网址&#xff1a;https://arxiv.org/abs/1909.01066 官方GitHub项目&#xff1a;https://github.com/facebookresearch/LAMA 本文是2019年…