算法学习笔记(最短路——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算法。

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

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

相关文章

IPD-开发流程

2024-5-6记录于PR办公室 在上一家公司做硬件产品经理的时候&#xff0c;Richard Li曾花费“巨资”请了华为前战略专家给我们培训&#xff0c;讲授IPD这门课的模式都很IPD&#xff0c;当时完全没重视&#xff0c;光想着不可能靠这个能把产品做好&#xff0c;这样做产品必定是一批…

wordpress外贸建站公司歪建站新版网站上线

wordpress外贸建站公司 歪猫建站 歪猫WordPress外贸建站&#xff0c;专业从事WordPress多语言外贸小语种网站建设与外贸网站海个推广、Google SEO搜索引擎优化等服务。 https://www.waimaoyes.com/dongguan

一种基于图搜索的全局/局部路径避障策略

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一种基于图搜索的全局/局部路径避障策略前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对一种基于图搜索…

TypeScript 中,泛型和接口之间有什么联系和区别?

在TypeScript中&#xff0c;泛型和接口是两种不同的概念&#xff0c;但它们可以一起使用来增强代码的类型安全性和灵活性。下面我们来探讨它们之间的联系和区别。 联系 类型安全性&#xff1a;泛型和接口都用于提高代码的类型安全性。通过使用泛型和接口&#xff0c;你可以在编…

【driver2】设备读写,同步和互斥,ioctl,进程休眠,时间和延时,延缓

文章目录 1.实现设备读写&#xff1a;write函数中一个进程写没问题&#xff0c;两进程写&#xff1a;第一个进程运行到kzalloc时&#xff0c;第二个进程也执行了kzalloc&#xff0c;只第二个进程地址保存在c中&#xff0c;第一个进程分配内存空间地址丢失造成内存泄漏。第一个进…

题目:排序疑惑

问题描述&#xff1a; 解题思路&#xff1a; 做的时候没想到&#xff0c;其实这是以贪心题。我们可以每次排最大的区间&#xff08;小于n&#xff0c;即n-1大的区间&#xff09;&#xff0c;再判断是否有序 。因此只需要分别判断排&#xff08;1~n-1&#xff09;和&#xff08;…

我独自升级崛起下载教程 我独自升级崛起一键下载

动作RPG游戏基于广大喜爱的动画和在线漫画《我独自升级崛起》在5月8日&#xff0c;这款新的游戏首次在全球亮相&#xff0c;意在给那些对游戏情有独钟的玩家带来更加丰富和多种多样的游戏体验。这个网络武侠题材的游戏设计非常具有创意&#xff0c;其主要故事围绕着“独孤求败”…

商业银行业务文件归档范围和档案保管期限

商业银行业务文件归档范围和档案保管期限 对公信贷业务文件归档范围和档案保管期限表 序号 归档范围 保管期限 备注 1 借款人、担保人基本资料 1.1 营业执照或事业法人证书 10年 1.2 法人授权委托证明书 10年 1.3 法定代表人身份证明 10年 1.4 特殊…

Dataframe数据类型相关问题汇总及处理方法

1. dataframe结构下有一列数据&#xff0c;有一部分是int类型&#xff0c;另一部分是object类型。当数据是int类型时&#xff0c;返回其本身&#xff0c;当是object类型时&#xff0c;采用其他处理方式&#xff1b; 使用lambda 和isinstance来实现&#xff1a; isinstance(x,…

数据分析——业务指标分析

业务指标分析 前言一、业务指标分析的定义二、业务问题构建问题构建的要求 三、业务问题的识别在识别问题的阶段对于企业内部收益者的补充 四、竞争者分析竞争者分析的内容竞争者分析目的案例 五、市场机会识别好的市场机会必须满足的条件市场机会案例 六、风险控制数据分析师常…

微信小程序开发:揭秘路由与页面跳转的艺术

微信小程序开发&#xff1a;揭秘路由与页面跳转的艺术 引言 在微信小程序的开发过程中&#xff0c;页面间的路由与跳转是构建用户交互体验的关键一环。不同于传统的Web开发&#xff0c;微信小程序的路由系统有其独特之处。本文将深入探讨微信小程序中路由的基本概念、作用以及…

【字符串】Leetcode 二进制求和

题目讲解 67. 二进制求和 算法讲解 为了方便计算&#xff0c;我们将两个字符串的长度弄成一样的&#xff0c;在短的字符串前面添加字符0&#xff1b;我们从后往前计算&#xff0c;当遇到当前计算出来的字符是> 2’的&#xff0c;那么就需要往前面进位和求余 注意&#xf…

【个人博客搭建】(18)使用Quartz.NET 定时备份数据库

Quartz.NET在系统主要承担的一些关键功能&#xff1a; 任务调度&#xff1a;Quartz.NET 允许开发人员创建、调度和管理定时任务&#xff0c;支持简单触发器和Cron表达式等多样化的触发策略。灵活性&#xff1a;Quartz.NET 提供了灵活的任务安排机制&#xff0c;不仅支持基于时间…

在企业中软件产品测试报告可以运用的场景

在企业应用场景中&#xff0c;测试报告的应用场景十分广泛且重要。以下是几个主要的应用场景&#xff1a; 产品质量评估与保证&#xff1a;测试报告是企业评估软件或产品质量的重要依据。通过测试报告&#xff0c;企业可以了解产品在不同场景下的性能表现、安全性、稳定性以及…

1.4 初探JdbcTemplate操作

实战目的 掌握Spring框架中JdbcTemplate的使用&#xff0c;实现对数据库的基本操作。理解数据库连接池的工作原理及其在实际开发中的重要性。通过实际操作&#xff0c;加深对Spring框架中ORM&#xff08;对象关系映射&#xff09;的理解。 关键技术点 JdbcTemplate操作&…

辐射类案例分析

辐射类案例分析 1.1 接地对辐射实验的影响 金属外壳接地已经成为了一种共识&#xff0c;很多人可能会认为金属外壳就该接地&#xff0c;接地可以改善EMC性能&#xff0c;对于抗干扰类实验&#xff0c;情况可能是这样&#xff0c;但是对于辐射类实验而言&#xff0c;有时候会有…

Java八股文系列之五(分布式事务)

什么是分布式事务 事务是一个程序执行单元&#xff0c;里面的所有操作要么全部执行成功&#xff0c;要么全部执行失败。在分布式系统中&#xff0c;这些操作可能是位于不同的服务中&#xff0c;那么如果也能保证这些操作要么全部执行成功要么全部执行失败呢&#xff1f;这便是…

直播预告|第一批 Vision Pro 开发者开始弃坑了吗? 本周六一起听听三位 XR 开发者的真实想法!

随着技术的进步&#xff0c;扩展现实&#xff08;XR&#xff09;行业正在迅速发展&#xff0c;成为连接现实与虚拟世界的桥梁。XR 技术&#xff0c;包括虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和混合现实&#xff08;MR&#xff09;&#xff…

Netty实现TCP代理

netty实现TCP代理通信 最近基于netty写了一个通信项目,发现netty还是很强的,就是API用的比较繁琐,当然熟练了之后就好了,实现了一个TCP代理的功能,其实原理比较简单,基本步骤: netty监听服务端口接受来自客户端的连接创建客户端连接代理服务器将连接、断开、接受消息、…

Web测试需要测试什么

Web测试可以涵盖以下方面的测试&#xff1a; 1.功能测试&#xff1a;确保Web应用的各项功能按照需求规格说明书的要求正常工作。测试包括用户注册、登录、搜索、数据提交、页面导航等功能。 2.用户界面测试&#xff1a;验证Web应用的用户界面是否符合设计和用户体验要求。测试…