【算法赌场】SPFA算法

1.算法简介

SPFA 算法的全称是:Shortest Path Faster Algorithm,是西南交通大学 段凡丁 于 1994 年发表的论文中的名字。不过,段凡丁的证明是错误的,且在 Bellman-Ford 算法提出后不久(1957 年)已有队列优化内容,所以国际上不承认 SPFA 算法是段凡丁提出的。

这个事情其实给我们信息学的学习一些启发的。首先,段凡丁肯定是一个大神了,他整理出了这个算法,发表论文。本身,他这篇论文质量很高的,这个算法本身没毛病,问题是作为一个论文,要把一个事情的来龙去脉都说得很清楚很严谨,不仅仅是这段代码能跑成功,而且还要有一个详细的证明过程,证明这段代码运行的结果是正确的,对各种情况进行分析和估算。段凡丁就是在论证这个算法的计算复杂度的时候出现了错误,所以,国际上不怎么承认段凡丁是 SPFA 算法的提出者(逻辑就是你连讲都没讲透彻,这怎么能说就是你的研究成果呢?)。

大家回头想想,如果你学一个算法,要滴水不漏的理解透彻,能讲得出这个算法为什么是对的,是多么呢?人家段大神都在这个问题上栽了大跟斗的。如果你真的要那么做,你一定要找人家的学术论文来看,每一字句去推敲。这个事,就不是我们课堂上那一丁点时间能解决的。所以,从初中开始,大家学习信息学,很多东西就是理解个 7-8 成之后拿来用,你可以有一套自己的思维导图,大致能想明白这个算法为啥是对的,但是,距离严谨证明是有差距的,但能用就行。

2.算法步骤

SPFA 其实是 Bellman-Ford 算法的一个改进。如果仅仅从代码角度来看,两个算法差异很大的,但是,从其思想来看同出一脉。

我们之前说过,Bellman-Ford 算法是有 BFS 算法的影子的,通过 N-1 轮松弛(第一层循环),找到最短路径。因为 N 个顶点的图,最长的简单路径不应该超过 N-1。Bellman-Ford 算法里面的第一层循环就是步数。

既然如此,为了提高效率,我们应该基础每一轮松弛了哪一些点,下一轮,就从这些新点往外延伸去松弛新的点。如果一个点在第 i 轮没有被松弛,我们在第 i-1 轮就不应该试图从它出发去找新的可到达点。这就是 SPFA 算法的核心所在。

为了区分哪一些点是新找到的点,就需要通过一个队列来做控制,新找到的点进队列,一个点往外延伸(类似搜索、探路)了之后,就把他弹出队列。一直重复这个操作,直到队列为空,SPFA 过程就结束了。

struct Edge{ //边的结构体,出发点不需要存,因为边是棣属于顶点的int v,w;
}e[500001];int dis[10001]; 
vector <int> chi[10001];
queue <int> q; bool inque[10001];void SPFA(){memset(dis,0x3f,sizeof(dis));dis[s] = 0;inque[s] = true; // inque 数组是用来记录这个顶点是否在队列当中q.push(s);while(q.size()){int u=q.front();q.pop();inque[u] = false;for(int i=0;i<chi[u].size();i++) //从顶点 t 出发,试图松弛一些点{// chi[u] 是动态数组,存放了从顶点 u 出发的所有边Edge tmp_e = e[chi[u][i]];  //chi[u][i] 是边的 idint v = tmp_e.v; // 这条边是从 u 到 vif(dis[v]>dis[u]+tmp_e.w) //松弛 ee.v 这个顶点,从 s 到 u,再从 u 到 v 是一条更优的路径{dis[v]=dis[u]+tmp_e.w;//v 是新探索到的顶点,放入队列if(!vis[v]){q.push(v);inque[v] = true;}}}}
}

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

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

相关文章

YOLOv11改进策略【卷积层】| CGblock 内容引导网络 利用不同层次信息,提高多类别分类能力 (含二次创新)

一、本文介绍 本文记录的是利用CGNet中的CG block模块优化YOLOv11的目标检测网络模型。CG block通过局部特征提取器、周围环境提取器、联合特征提取器和全局环境提取器来提取局部特征、周围环境和全局环境信息,充分利用不同层次的信息。本文将其应用到v11中,并进行二次创新,…

并发编程(6)——future、promise、async,线程池

六、day6 今天学习如何使用std::future、std::async、std::promise。主要内容包括&#xff1a; 参考&#xff1a; https://llfc.club/category?catid225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2Agk6II6SsiG8DwPawfXHsP4bUT https://github.com/Mq-b/ModernCpp-ConcurrentProgrammin…

力扣——另一个的子树(C语言)

1.题目&#xff1a; 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree …

【C++】对左值引用右值引用的深入理解(右值引用与移动语义)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 ​ 目录 前言&#xff1a;对引用的底层理解 一、左值与右值 提问&#xff1a;左值在左&#xff0c;右值在右&#xff1f;…

解决 ClickHouse 高可用集群中 VRID 冲突问题:基于 chproxy 和 keepalived 的实践分析

Part1背景描述 近期&#xff0c;我们部署了两套 ClickHouse 生产集群&#xff0c;分别位于同城的两个数据中心。这两套集群的数据保持一致&#xff0c;以便在一个数据中心发生故障时&#xff0c;能够迅速切换应用至另一个数据中心的 ClickHouse 实例&#xff0c;确保服务连续性…

B2C电商平台如何提升转化率 小程序商城如何做好运营

在竞争激烈的电商市场中&#xff0c;提升转化率是每个B2C电商平台的重要目标。转化率直接影响销售业绩和盈利能力&#xff0c;因此&#xff0c;了解如何优化用户体验、增强客户信任和提高购买动机是至关重要的。商淘云分享一些有效的策略&#xff0c;帮助B2C电商平台提升转化率…

慢SQL优化方向

口语化答案 为了优化慢 SQL 查询&#xff0c;我通常会从几个方面入手&#xff1a; 首先&#xff0c;我会检查查询语句本身。确保使用了合适的索引&#xff0c;避免全表扫描。比如&#xff0c;在WHERE、JOIN或ORDER BY子句中涉及的列上创建索引&#xff0c;这样可以大大提升查…

智能合约中的AI应用

在智能合约中引入人工智能&#xff08;AI&#xff09;技术可以提升自动化、智能化和数据处理能力&#xff0c;从而在多个领域中带来创新应用。智能合约是指运行在区块链网络上的自动执行程序&#xff0c;可以通过预先设定的规则进行交易或事件触发。将AI与智能合约结合可以使合…

RK3568平台开发系列讲解(字符设备驱动篇)Linux设备分类

🚀返回专栏总目录 文章目录 一、字符设备(是以字节为单位进行输入输出)二、块设备:块设备是以块为单位进行输入输出三、网络设备沉淀、分享、成长,让自己和他人都能有所收获!😄 一、字符设备(是以字节为单位进行输入输出) 串口、鼠标 字符设备没有固定的大小,也没…

STM32Fxx读写eeprom(AT24C16)

一.I2C 协议简介 I2C 通讯协议 (Inter &#xff0d; Integrated Circuit) 是由 Phiilps 公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c;不需要 USART、CAN 等通讯协议的外部收发设备&#xff0c;现在被广泛地使用在系统内多个…

GitHub每日最火火火项目(11.4)

twentyhq/twenty&#xff1a;“twentyhq/twenty”致力于打造一个由社区驱动的现代版 Salesforce 替代品。在企业管理软件领域&#xff0c;Salesforce 一直占据着重要地位&#xff0c;但可能存在一些成本高、定制性有限等问题。这个项目使用 TypeScript 语言开发&#xff0c;旨在…

idea使用Translation插件实现翻译

1.打开idea&#xff0c;settings&#xff0c;选择plugins&#xff0c;搜索插件Translation&#xff0c;安装 2.选择翻译引擎 3.配置引擎&#xff0c;以有道词典为例 3.1 获取应用ID&#xff0c;应用秘钥 3.1.1 创建应用 点击进入有道智云控制台 3.1.2 复制ID和秘钥 3.2 idea设…

torch.from_numpy()和torch.tensor()区别

torch.from_numpy()和torch.tensor()都可以用于创建PyTorch张量&#xff0c;但它们有以下区别&#xff1a; 1. 数据共享与内存占用 torch.from_numpy()&#xff1a;这个函数创建的PyTorch张量与原始numpy数组共享相同的数据内存。这意味着&#xff0c;如果修改了numpy数组中的…

【论文精读】LPT: Long-tailed prompt tuning for image classification

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;论文精读_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 摘要 2. …

【SQL Server】解决因使用 varchar 类型存储 Unicode 字符串导致的中文显示乱码问题

问题描述 导入 SQL 到 SQL Server 数据库后&#xff0c;存在部分列的中文显示异常的问题。 原因分析 观察发现显示异常的字段的数据类型是 varchar&#xff0c;而显示正常的字段的数据类型是 nvarchar。 而且&#xff0c;SQL 文件中所有字符串前面都带有 N 的前缀。 在 SQL 中…

dify实战案例分享-基于多模态模型的发票识别

1 什么是dify Dify是一个开源的大语言模型&#xff08;LLM&#xff09;应用开发平台&#xff0c;旨在简化和加速生成式AI应用的创建和部署。它结合了后端即服务&#xff08;Backend as Service, BaaS&#xff09;和LLMOps的理念&#xff0c;使开发者能够快速搭建生产级的AI应用…

电机控制储备知识 一 电机驱动本质分析以及磁相关的使用场景

一&#xff1a;电机旋转的原因 1.电机基本认识 &#xff08;1&#xff09;电机是一种动力装置&#xff0c;能够将电能转换为动能 电机拥有体积小 、动力足&#xff0c;控制精细灵活的特点 完整的电机系统&#xff1a;电机&#xff08;减速器 传感器&#xff09; 电机驱动器&a…

ubuntu交叉编译dbus库给arm平台使用

1.下载dbus库源码 https://www.freedesktop.org/wiki/Software/dbus 克隆源码: https://gitlab.freedesktop.org/dbus/dbus/-/tree/dbus-1.12?ref_type=heads 下载1.12.20版本: 指定pkgconfig环境变量: export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$PWD/../expat-2.3.…

【Java】java | 配置静态资源 | web服务器 | vue build后放到SpringBoot项目中 | 前后端不分离

一、概述 项目vue springboot&#xff0c;前后端分离项目&#xff1b;但部署时&#xff0c;不想用nginx代理&#xff0c;想要前端npm run build:prod后&#xff0c;将dist的目录整体复制到SpringBoot项目中&#xff0c;通过静态资源映射&#xff0c;节省一个端口。 二、操作步…

推荐一款音乐神器:想听就听,想下就下~

在这个音乐充斥生活的时代&#xff0c;你是否也曾想过&#xff0c;有一款软件可以随时随地畅听你喜欢的音乐&#xff1f;今天&#xff0c;我要向你推荐一款令人心动的音乐神器——MusicFree&#xff0c;让你真正体验“想听就听&#xff0c;想下就下”的乐趣&#xff01; 那么&a…