Dijkstra?spfa?SPstra?

带负权的无负环最短路问题

对于一张有负边权的图,普通 Dijkstra 就不能用了,比如:
在这里插入图片描述
正常的 Dijkstra 扩散的节点依次为 1,3,2,41,3,2,41,3,2,4
这时候可以发现,当点 222 扩散的时候,原本达到点 333 的路径长度是 111,路径 1⟶2⟶31\longrightarrow2\longrightarrow3123 的权值之和为 −2-22,明显更短,这个时候点111 到点 333 的路径长度就会被更新为 −2-22,但是,点 333 在点 222 之前已经被扩散过,不会在进行第二次扩散。此时,点 111 到点 444 的路径长度依旧是 1+2=31+2=31+2=3

这里说明了 Dijkstra 的一个缺陷,贪心思路会考虑不到后续的负数。

那么,我们可以对 Dijkstra 做一个改动,解决现在遇到的问题。
上述的问题发生的根源就是 visvisvis 数组,在当前点找到更优值的时 visvisvis 数组不会改变,就导致了上图中点 444 没有被更新,所以我们在找到更优值时就再给当前点一个机会。

if(dis[y]>dis[x]+z){vis[y]=0;dis[y]=dis[x]+z;
}

这样可以很好地解决上图中出现的问题,但是判断负环还是需要 SPFA
那么,我们将上述的改动版 Dijkstra 命名为SPstra
在这里插入图片描述

带负环的最短路问题

这个时候就可以考虑用到 SPFA。
SPFA 与 Dijkstra 的不同点:

入队条件

Dijkstra 的遍历概念是:扩散
而 SPFA 的遍历概念是:挑选
SPFA 的标记表示的是“是否在队列中”,也就是说有没有看过这个元素值更新后对相连点的影响。
如果没有在队列中,并且还找到了当前点更优的方案,那么当前点就该入队上班了。(可以借助文章最顶上的图来理解)。

出队标记

出队后,元素就不在队列中了,标记取消。

负环判断

负环是什么?
负环就是一个有向图中的环,并且对这个环遍历一圈得到的权值总和为负,那么这个时候就可以一直绕着这个环转圈圈,使权值总和越来越小。
我们假设:一张有 nnn 个点的有向图中有这样一个点 xxx,这个点十分有魅力,图中其余的 n−1n-1n1 个点都有一条边连向这个点。

再极端一点,这其余的 n−1n-1n1 个点按照被遍历到的顺序依次对点 xxx 有更优贡献。
那么,这个点就会被入队 n−1n-1n1 次,这个时候还没有出现负环。
但是,如果这个点再被入队一次,入队次数达到了 nnn 次,就一定有一个点(暂且称为点 yyy)连接点 xxx 的这条路径被遍历了两次,这个时候就有了负环,因为点 xxx 在被点 yyy 连接的情况下还有一条负数边权和的路径连接着点 yyy

SPFA 可否使用优先队列优化

其实使用优先队列优化的 SPFA 就是前面的 “SPstra” 加上一个负环判断。

对于这个问题,答案是:能,但是很极端。

SPFA 优先队列优化的适用场景

对于正边权居多的图,可以使用优先队列优化,这样可以使效率接近 Dijkstra 的 O(Nlog⁡N)O(N\log N)O(NlogN)

普通 SPFA 的适用场景

对于负边权居多的图,其实普通队列和优先队列的遍历次数都是差不多的,只是顺序变了,而且优先队列还多了一个 O(log⁡N)O(\log N)O(logN),效率还不如普通队列。

总结

考试或者比赛时,题目的数据我们无从得知。
但我们知道的是,造数据的人们都是阴险狡诈忠恳善良的,我们可以猜疑相信他们。

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

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

相关文章

React函数组件灵魂搭档:useEffect深度通关指南!

你以为它只是替代componentDidMount?数据抓取、事件绑定、定时清理...?事实上,useEffect才是函数组件的“幕后操控者”!但依赖数组的坑、闭包的陷阱,你真的玩转了吗? 告别“能用就行”,今天带你…

LabVIEW实验室测试框架

在实验室测试场景中,选用合适的 LabVIEW 框架能够极大提升测试效率、优化测试流程并保障测试结果的准确性。介绍几款常用且功能强大的 LabVIEW 测试框架:​TestStand​框架概述​TestStand 是 NI 公司专为测试系统开发设计的一款测试执行管理框架。它能够…

Kiro :从“规范”到“实现”的全流程 AI 助手

为什么是 Kiro Kiro 是一款面向“规范驱动开发”(Spec-Driven Development)的 AI 开发助手。与只在“写代码”环节辅助不同,Kiro 将“从需求到设计再到实现”的完整链路显性化,把需求、设计、任务分解、代码与测试、文档等全部纳…

【0基础PS】PS工具详解--矩形工具

目录前言一、矩形工具的基础认知​二、矩形工具的选项栏详解​三、矩形工具的绘制技巧​四、矩形工具的实际应用场景​五、常见问题与解决方案​总结前言 在 Photoshop(简称 PS)的众多绘图工具中,矩形工具是使用率极高的基础工具之一。无论是…

移动端app专项测试

学习目标:app专项测试知识点,其他知识扩充一、app专项(app怎么测试/app侧重点在哪)1.功能:跟前面功能测试一样(跟需求文档提取测试点,编写测试用例)2.安装1.不同品牌安装,不同操作系…

Spring Boot 结合 CORS 解决前端跨域问题

Spring Boot 结合 CORS 解决前端跨域问题 1. 背景 在前后端分离的项目中,前端(例如 http://localhost:3000)调用后端接口(例如 http://localhost:8080)时,浏览器会因为 同源策略 限制而阻止请求&#xff0c…

GPT-5 发布:微小进步难掩瓶颈,AI 行业或迎冷静

北京时间 8 月 8 日凌晨,OpenAI 的 GPT-5 在万众期待中登场。距离 GPT-4 发布已过去两年半,然而这场发布会却未重现 ChatGPT 初现时的惊艳,也没有 GPT-4 的跨越式升级,更无 o1 发布时的震撼。1 小时 20 分钟的发布会,充斥着不惊艳的测试数据、与竞品难分高下的用例展示,甚…

僵尸进程、孤儿进程、进程优先级、/proc 文件系统、CRC 与网络溢出问题处理(实战 + 原理)

僵尸进程 / 孤儿进程:是什么、为什么会出现、如何定位与清理进程优先级:nice/priority、CFS 与实时调度、I/O 优先级、cgroup 限流/proc 文件系统:最常用路径与诊断手法CRC 校验:在存储/网络里的作用与局限、抓包“校验错误”的常…

GPT-5 不仅是版本升级,它标志着 推理能力的商业化 和 Agent操作系统 的崛起,开启了 AI革命时代。

GPT-5 不仅是版本升级,它标志着 推理能力的商业化 和 Agent操作系统 的崛起,开启了 AI革命时代。 核心技术亮点: 商业化推理能力:AI不仅生成文本,还能 自动解决复杂任务,提升工作效率。 Agent操作系统&…

【C#】掌握并发利器:深入理解 .NET 中的 Task.WhenAll

在现代 .NET 应用程序开发中,异步编程(Asynchronous Programming)已成为提升性能、改善响应能力和充分利用多核处理器的关键技术。async 和 await 关键字极大地简化了异步代码的编写,而 Task 类则是这一模型的核心。在处理多个并发…

微型导轨在半导体制造中有哪些高精密应用场景?

微型导轨在半导体制造中用于晶圆对准和定位系统,确保晶圆在光刻、蚀刻等工艺中精确移动。其高精度、高刚性、低摩擦和紧凑设计等特性,使其成为半导体设备实现微米级运动控制的核心部件。光刻机:在光刻工艺中,微型导轨支撑并引导掩…

全栈:Tomcat 安装教程

Tomcat 安装教程 安装 Tomcat 的步骤因操作系统而异,以下是 Windows、Linux 和 Mac 系统的详细安装方法: 一、Windows 系统安装 Tomcat 下载 Tomcat 访问 Tomcat 官方网站(http://tomcat.apache.org/),选择适合的版本…

数据分析——Pandas库

Pandas是Python生态系统中最强大、最流行的数据分析库,专为处理结构化数据(如表格和时间序列)而设计。它提供了高效的数据结构和丰富的功能,使得数据清洗、转换、分析和可视化变得简单直观。一、Pandas库的安装详解1. 安装前的准备…

数据结构-哈希表(散列表)

1.基本概念哈希表(散列表):提高数据的查找效率哈希存储:将要存储的数据的关键字和存储位置之间,建立起对应的关系, 这个关系称之为哈希函数。存储数据时,通过对应的哈希函数可以将数据映射到指定…

如何在Vue中使用拓扑图功能

前言 该组件基于 Vue.js 和 AntV G6 构建项目特色功能 1. 丰富的节点图标支持 本拓扑图系统的最大特色是支持使用自定义图片作为节点图标 2. 智能的力导向布局 系统采用力导向布局算法,能够自动优化节点位置,避免重叠,形成美观的网络拓扑结构…

基于dynamic的Druid 与 HikariCP 连接池集成配置区别

你提供的内容是关于 ​​dynamic-datasource-spring-boot-starter​​ 的详细介绍,这是一个非常实用的 ​​Spring Boot 多数据源动态切换组件​​,适用于需要在单个应用中连接多个数据库并灵活切换数据源的场景。下面我为你梳理一下该组件的核心信息与使…

算法训练之栈

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

OpenAI 最新开源模型 gpt-oss (Windows + Ollama/ubuntu)本地部署详细教程

OpenAI 最近发布了其首个开源的开放权重模型gpt-oss,这在AI圈引起了巨大的轰动。对于广大开发者和AI爱好者来说,这意味着我们终于可以在自己的机器上,完全本地化地运行和探索这款强大的模型了。 本教程将一步一步指导你如何在Windows系统上&…

在X86架构Linux中创建虚拟根目录并下载指定架构(如aarch64)的软件包(含依赖)

在X86架构Linux中创建虚拟根目录并下载指定架构(如aarch64)的软件包(含依赖) 在Linux系统中,有时候我们需要在特定的环境或架构下安装软件包,而不影响主系统。一种常见的方法是创建一个虚拟的根目录,并在此环境中操作。本文将介绍如何通过创建…

scratch笔记和练习-第9课:一起来绘画

位图也称为点阵图,它是由许许多多的点组成的,这些点被称为像素。位图图像可以表现丰富的多彩变化 并产生逼真的效果,很容易在不同软件之间交换使用, 但它在保存图像时需要记录每一个像素的色彩信息,所以占用的存储空间…