图论·Bellman_ford算法

无负权回路例题
带负权回路例题

Bellman_ford算法

适用条件

  • 单源最短路径
  • 存在负权值边
  • 检测负权回路

核心操作

  • 松弛:对每条边与源点的距离重新计算
if (dist[item.v1] != INT_MAX && dist[item.v1] + item.w < dist[item.v2]) {dist[item.v2] = dist[item.v1] + item.w;//dist[item.v1]未更新时应该跳过
}
  • 迭代:可以视为一种逼近,利用边的信息一层层迭代,每一层都利用了上一层迭代的结果,所以源点到达各个结点的距离会越来越接近最小值,最终达到终点的距离也会接近最小值(但这好像不是贪心的思想,而只是简单的迭代逼近)

个人代码

using namespace std;
using ll = long long;
int n, m, s, t, v;
struct Edge {int v1, v2, w;
};
void solve() {cin >> n >> m;vector<Edge>edges;vector<int>dist(n + 1, INT_MAX); dist[1] = 0;while (m--) {cin >> s >> t >> v;edges.push_back({ s,t,v });}for (int i = 1; i < n; i++) {for (auto item : edges) {if (dist[item.v1] != INT_MAX && dist[item.v1] + item.w < dist[item.v2]) {dist[item.v2] = dist[item.v1] + item.w;//dist[item.v1]未更新时应该跳过}}}if (dist[n] == INT_MAX) {cout << "unconnected";}else {cout << dist[n];}
}
int main() {std::ios::sync_with_stdio(false);std::cin.tie(0); std::cout.tie(0);solve();return 0;
}

判断负权回路

输出结果前多加上一层循环,改掉判断逻辑即可

for (auto item : edges) {if (dist[item.v1] != INT_MAX && dist[item.v1] + item.w < dist[item.v2]) {cout << "circle";return;//return不可以省略}
}

注意事项

  • dist[item.v1] != INT_MAX不可以省略
  • vector<Edge>edges;存储方式既不是邻接矩阵也不是邻接表

优化版SPFA

核心操作

  • 队列操作:类似BFS,目的是防止对一个出更新的边进行无意义的操作
  • 存储方式:邻接表

个人代码

using namespace std;
using ll = long long;
int n, m, s, t, v;
struct Edge {int vex, weight;
};
void solve() {cin >> n >> m;vector<int>dist(n + 1, INT_MAX); dist[1] = 0;vector<list<Edge>>grid(n + 1, list<Edge>());queue<Edge>q;while (m--) {cin >> s >> t >> v;grid[s].push_back({ t,v});}q.push({ 1,0 });while (!q.empty()) {Edge cur = q.front();q.pop();for (auto item : grid[cur.vex]) {if (dist[cur.vex] + item.weight < dist[item.vex]) {dist[item.vex] = dist[cur.vex] + item.weight;q.push(item);}}}if (dist[n] == INT_MAX) {cout << "unconnected";}else {cout << dist[n];}
}
int main() {std::ios::sync_with_stdio(false);std::cin.tie(0); std::cout.tie(0);solve();return 0;
}

判断负权回路

只要一个顶点被加入到队列的次数>=n,一定出现了负权回路

  • 定义计数数组
vector<int>count(n + 1, 0);
  • 初始化队列
q.push({ 1,0 }); count[1]++;
  • 队列操作逻辑更新
while (!q.empty()) {Edge cur = q.front();q.pop();if (count[cur.vex] >= n) {//判断加入队列的次数cout << "circle";return;}for (auto item : edges[cur.vex]) {if (dist[cur.vex] + item.weight < dist[item.vex]) {dist[item.vex] = dist[cur.vex] + item.weight;q.push(item);count[item.vex]++;}}
}

时间复杂度

  • 朴素版Bellman_ford算法:O(NM),N是顶点数,M是边数
  • SPFA算法:O(KN),N是顶点数,K是个不定值,取决于总共加入多少条边到队列中去
    • 进出队列的时间不计

本文参考于代码随想录

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

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

相关文章

晶振在硬件系统中的位置选择与优化策略

在现代电子设备中&#xff0c;晶振扮演着至关重要的角色&#xff0c;它们提供稳定且精确的时钟信号&#xff0c;是系统心脏般的存在。然而&#xff0c;晶振的性能不仅取决于其本身的质量&#xff0c;还与它在硬件系统中的位置选择紧密相关。一个恰当的位置能够最大限度地减少外…

基于K线最短路径构造的非流动性因子

下载地址https://download.csdn.net/download/SuiZuoZhuLiu/89492221

软件工程简答

什么是软件工程 软件工程&#xff1a;将系统化的、规范的、可量化的方法应用于软件的开发、运行和维护&#xff0c;即将工程化方法应用于软件。支持软件工程的根基在于质量关注点。 软件工程的基础是过程层&#xff0c;将各个技术层次结合在一起。方法层为构建软件提供技术上的…

springboot调用wsdl接口

springboot调用wsdl接口 maven依赖 <!--xml报文数据--><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.9.8</version></dependency><…

nodejs--【Express基本使用】

10 【Express基本使用】 https://www.expressjs.com.cn/ 基于 Node.js 平台&#xff0c;快速、开放、极简的 web 开发框架。 1.Express的安装方式 Express的安装可直接使用npm包管理器上的项目&#xff0c;在安装npm之前可先安装淘宝镜像&#xff1a; npm install -g cnpm -…

Mysql 对重复数据筛选过滤

在日常开发工作中常会遇到要对数据库中的重复数据做筛选的操作需求&#xff0c;可以考虑使用排序函数&#xff08;ROW_NUMBER()&#xff09; 第一种写法&#xff1a;row_number() over(partition by 一个或多个分组列 order by 一个或多个排序列 asc/desc) as 别名 //如果不写a…

PostgreSQL 数据库设计与管理(四)

1. 数据库设计原则 1.1 规范化 规范化是组织数据库结构的一种方法&#xff0c;旨在减少数据冗余并提高数据完整性。常用的规范化范式包括&#xff1a; 第一范式&#xff08;1NF&#xff09;&#xff1a; 确保每列都是原子的&#xff0c;不可再分。第二范式&#xff08;2NF&a…

领先Intel 旗舰60%,AMD锐龙9000系桌面CPU彻底杀疯了

早在月初台北国际电脑展上&#xff0c;Intel 公布了下一代低功耗移动端处理器 Lunar Lake。 也就是第二代移动版酷睿 Ultra。 而作为叫板王&#xff0c;AMD 丝毫不怂&#xff0c;不但掏出了 Ryzen AI 300 移动端处理器应对。 还抢在 Intel 之前带来了全新一代 Zen 5 架构 Ryz…

前端vue项目升级nodejs后无法运行了

问题描述&#xff1a; 运行、打包都正常的vue项目&#xff0c;在将nodejs升级到v20.14.0后&#xff0c;均报错了&#xff1a; Error: error:0308010C:digital envelope routines::unsupported opensslErrorStack: [ error:03000086:digital envelope routines::initializ…

制造业如何拥抱数字化?百数服务商的转型策略与实践

制造业作为实体经济的主体部分&#xff0c;也是核心部分&#xff0c;发挥着基础性、主导性和引领性作用。推动制造业数字化转型是实现经济高质量发展的必由之路。 在这场数字化浪潮中&#xff0c;低代码平台作为一种新兴的技术手段&#xff0c;逐渐受到了企业的青睐。其能够在…

[5]python+selenium - UI自动框架之重写unittest.TestCase

重写unittest.TestCase 不仅继承了unittest的方法&#xff0c;还丰富不同断言方法&#xff0c;用起来更方便、简单。 import unittest from common.BSBase import BasePage from common.log import log from common.browserDriver import getdriver from common.publicFunc imp…

2024.06.30 刷题日记

121. 买卖股票的最佳时机 实例 1&#xff1a; 输入&#xff1a;[7,1,5,3,6,4] 输出&#xff1a;5 解释&#xff1a;在第 2 天&#xff08;股票价格 1&#xff09;的时候买入&#xff0c;在第 5 天&#xff08;股票价格 6&#xff09;的时候卖出&#xff0c;最大利润 6-1 5…

高考假期预习指南:开启你的IT学习之旅

七月来临&#xff0c;各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束&#xff0c;而是新旅程的开始。对于有志于踏入IT领域的高考少年们&#xff0c;这个假期是开启探索IT世界的绝佳时机。作为一名在计算机行业深耕多年的专家&#xff0c;我愿意为准新生们提供一份…

等级保护测评在测评中Linux系统怎么改

在等级保护测评中&#xff0c;针对Linux系统的整改主要是为了提高其安全性&#xff0c;使之符合等级保护的基本要求。 以下是一些常见的整改步骤和建议&#xff1a; 1. 身份鉴别&#xff1a; • 强化密码策略&#xff0c;例如设置复杂的密码规则、密码长度、密码复杂度、密码…

Web基础与HTTP协议:

Web基础与HTTP协议 Web&#xff1a;就是我们所说的页面&#xff0c;打开网站所展示的页面。&#xff08;全球广域网&#xff0c;万维网&#xff09; 分布式图形信息系统。 http https &#xff08;加密的&#xff09;超文本传输协议 分布式&#xff1a;计算机系统或者应用程序…

大型游乐设施操作试题

选择题 1、《游乐设施安全技术监察规程(试行)》规定:制造单位应在游乐设施明显部位装设铭牌&#xff0c;铭牌内容至少应包括制造单位名称与地址、设备名称、编号等等技术参数&#xff0c;但下列除哪项外均正确。[单选题]* A、速度和高度 B、生产许可证号 C、制造单位的联系电话…

WLAN Hostapd配置参数详解 - EN

中文的配置参数详解&#xff1a;WLAN Hostapd配置参数详解-CSDN博客 ##### hostapd configuration file ############################################## # Empty lines and lines starting with # are ignored # AP netdevice name (without ap postfix, i.e., wlan0 uses wl…

vue3引入本地静态资源图片

一、单张图片引入 import imgXX from /assets/images/xx.png二、多张图片引入 说明&#xff1a;import.meta.url 是一个 ESM 的原生功能&#xff0c;会暴露当前模块的 URL。将它与原生的 URL 构造器 组合使用 注意&#xff1a;填写自己项目图片存放的路径 /** vite的特殊性…

SQL注入【1】——通用漏洞/SQL注入/mysql跨库/ACCESS偏移

一、知识点: 1、脚本代码与数据库前置知识 2、Access数据库注入-简易&偏移 3、MYSQL数据库注入-简易:权限跨库 二、前置知识: &#xff08;一&#xff09;SQL注入漏洞产生原理分析 SQL注入产生条件&#xff1a;根本条件&#xff1a;可控变量、特定函数。 脚本代码在实现…

教育行业的网络安全:保护学生数据与防范网络欺凌

在数字化的春风中&#xff0c;教育行业迎来了知识的繁花似锦&#xff0c;然而&#xff0c;随之而来的网络安全风暴也悄然逼近。学生数据的脆弱性与网络欺凌的阴影交织成一幅复杂的画卷&#xff0c;呼唤着教育工作者与技术专家共同编织一张密不透风的网络安全之网。本文深入探讨…