Dijkstra算法为什么不能用于负权图

dijkstra算法为什么不能计算负权重?   这几天在看迪杰斯特拉算法(dijkstra算法)的时候,了解到这个算法不能够计算负权重,这让我很纳闷???为什么呢???下面我按照我理解的解释一番,若有错误希望阅读者能够评论指出,不胜感激。 我们看上图,求A到其他节点的最短路径:   首先得出A -> B = 1,A -> C = 0,A -> D = 99,然后将A被标记访问过。 接着找B到其他节点的距离,看看能不能更新... 阅读详情
AI摘要

探讨Dijkstra算法原理,分析其在正权图中有效性的原因,指出算法在处理负权图时的局限性,并通过实例说明为何Dijkstra算法不适合负权图。

Dijkstra算法是贪心算法,大概前提是,从当前的所有可能中就能找到全局的最优解,而负权图不满足这个条件(比如本文末尾的图例)

让我们从它的算法步骤上仔细分析一下:(如果需要算法详解点这里)

    1.将图上的初始点看作一个集合S,其它点看作另一个集合

    2.根据初始点,求出其它点到初始点的距离d[i] (若相邻,
        则d[i]为边权值;若不相邻,则d[i]为无限大)

    3.选取最小的d[i](记为d[x]),并将此d[i]边对应的点
        (记为x)加入集合S

    4.再根据x,更新跟 x 相邻点 y 的d[y]值:d[y] = min{
         d[y], d[x] + 边权值w[x][y] },因为可能把距离调小,所以这个更新操作叫做松弛操作。

    5.重复3,4两步,直到目标点也加入了集合,此时目标点所
        对应的d[i]即为最短路径长度。

在第三步中,若点 x 的 d[x] 值是最小的,就将此点加入集合,而这个 d[x] 便也就是 x 到初始点的最短距离了。

所以d[x]的确定尤其重要,而第三,四步中,d[x] 是根据已经处于集合中的点来更新的。

如果是正权图,集合内的点到初始点的最短距离已经确认了,把没在集合内的点加入路径只可能会增加无用的边,也就增加了路径长度;所以只根据集合内点的邻边来更新,就能得到当前的最小d[x]了。

但如果是负权图,注意上句话中的文字 “把没在集合内的点加入路径”,这个时候,如果边的长度是负的,就有可能产生更小的d[x]!而Dijkstra根本没有不会考虑 “把没在集合内的点加入路径”这种情况,这也就是Dijkstra算法目光短浅的原因。

 

这里有一个简单的例子:

    从A到B的最短路。

    用Dijkstra算法,第一步就能得到所谓的最短路径长度4,不会去考虑边(C,B)。

    而实际上最短路径却需要加入边(C, B),长度是2。

最短路径4:SPFA算法 SPFA算法 1.时间复杂度比普通的Dijkstra和Ford低。 2.能够计算负权图问题。 3.能够判断是否有负环 (即:每跑一圈,路径会减小,所以会一直循环跑下去)。 动态逼近法: 1.设立一个先进先出的队列用来保存待优化的结点。 2.优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。 3.这样不断从队列中取出结点来进行松弛操作,直至队列空为止 期望的时间复杂度O(ke), 其中 阅读详情

相关推荐

最短路算法总结

负权图 在一个图里每条边都有一个权值(有正有负),如果存在一个环(从某个点出发又回到自己的路径),而且这个环上所有权值之和是负数,那这就是一个负权环,也叫负权回路。存在负权回路的图是不能求两点间最短路的,因为只要在负权回路上不断兜圈子,所得的最短路长度可以任意小。(没有最短路) 单源点的最短路径问题是指:给定一个加权有向图G和源点s,对于图G中的任意一点v,求从s到v的最短路径。 最短路

E_ROAD_BY_U的博客 2954

dijkstra算法,真的不能计算负权值吗?

很多人都知道dijkstra算法不能计算负权值。 但是不是所有人都深刻地认识了这一原因。 以下面的例子为例: 如果用dijkstra算法来计算最短路径,一定会出错。 因为按照dijkstra算法,它的原则是基于贪心进行查找,所以它的查找顺序应该是:BEDC。 造成的结果就是:找到第二个节点时,就会直接判断E的最短路径为-3.并且后续节点的查找也不会改变这个值。 但是显然,我们知道E的最短路径为-4. 出现这种情况的根本原因是,负环(含负值的环)出现。导致贪心的查找逻辑无法继续成立。 用通俗的话来说,就是面

highlighters的博客 9271

最短路算法详解(Dijkstra 算法,Bellman-Ford 算法,Floyd-Warshall 算法)

求解最短路是图论中的一个经典问题,本文将讲解最经典的三种求解图论最短路算法:最短路1. 单源最短路径:Dijkstra 算法(迪杰斯特拉算法)(不能解决负权图)。2. 单源最短路径:Bellman-Ford 算法(贝尔曼-福特算法)(可以解决负权图)。3. 多源最短路径:Floyd-Warshall 算法(弗洛伊德算法)(可以解决负权图)。

2301_80035594的博客 3124

Dijkstra无法处理负权边的原因

为啥不能处理负权? 首先我们要清楚一个点:Dijkstra是每次贪心的选择跟当前邻接的点,而不会去考虑处邻接之外的其他点 而如果所有Dijkstra算法适用于不存在负权边的图(有无向均可),这个是因为迪杰斯特拉算法是基于贪心策略,每次都找一个距源点最近的点,然后将该距离定为这个点到源点的最短路径;但如果存在负权边,那么直接得到的最短路不一定是最短路径,因为可能先通过并不是距源点最近的一个次优点,再通过一个负权边,使得路径之和更小,这样就出现了错误。如下: 1——>2权值为5,1——>..

Stillboring的博客 5630

LinuxCNC 源码解析:从界面开发到硬件交互的实战指南

本文深入解析LinuxCNC源码架构,从用户界面开发到硬件交互的实战指南。涵盖GTK与Tkinter界面开发、HAL硬件抽象层、G代码解析器改造及运动控制核心等关键模块,提供定制化开发技巧与性能优化方案,助力开发者高效掌握数控系统开发。

weixin_27066963的博客 190

Android逆向分析

Android 逆向开发是指对已发布的 Android 应用进行分析和破解,以了解应用程序的内部工作原理,获取应用程序的敏感信息,或者修改应用程序的行为。Android应用 Java编写的,利用Android SDK编译代码,并并且把所有的数据和资源文件打包成一个APK(Android Package)文件这是一个后缀名为.apk的压缩文件,apk文件中包含了一个Anddroid应用程序的所有内容,是Android平台用于安装应用程序的文件。

qq_51598534的博客 6293

Dijkstra算法和Floyd算法的区别之处:

1、Dijkstra不能处理负权图;Flyod能处理负权图,但不能有回路; 2、Dijkstra处理单源最短路径;Flyod是处理多源最短路径 3、Dijkstra时间复杂度为O(n^2) Flyod时间复杂度为O(n^3) 空间复杂度为O(n ^ 2); 所以题目中如果是单源点正权图,就用Dijkstra 如果是任意两个点之间的最短路径或者是负权图,就用Floyd; ...

qq_24263553的博客 2678

Hcaptcha验证码的‘免浏览器’破解思路:协议分析与N值算法逆向

本文深入解析Hcaptcha验证码的‘免浏览器’破解思路,通过协议分析与N值算法逆向,实现高效自动识别。文章详细拆解Hcaptcha的API交互流程,揭示关键参数`req`和`n`的生成机制,并提供轻量级实现方案,显著降低资源消耗,适用于大规模数据采集等场景。

weixin_30838873的博客 535

正权图的 Dijkstra 最短路算法

最短路径问题是图论中最经典且重要的应用问题之一。它的目标是找到一个图中从起点到终点的最短路径,即在所有可能的路径中,选择一条边权和最小的路径。该问题广泛存在于多个实际场景中,比如交通运输、通信网络、导航系统等。 在实际生活中,很多情况都涉及到寻找最短路径。例如,导航系统需要为用户推荐从当前位置到目的

fenfenfen520a的博客 101

tsmc12: m0po max length问题(H384.M0_PO.L.1)

手动调整可以挪cell,制造上下两个row相对的至少一个site的空间,通过插普通filler来解决,这里需要注意的是,tsmc12有via0的规则,需要让via0落在via0 grid上。在pt eco之后会有一些m0po max length问题出现,大部分问题都可以通过替换decap来解决,少部分由于局部density过高,需要手动调整。更多学习内容请关注「拾陆楼」知识星球。#ICC2中替换decap的参考脚本。

m0_61544122的博客 790

YOLOv8 改进涨点 | 模块即插即用 直接可用

在目标检测任务中,注意力机制能够帮助模型聚焦于图像中的关键区域,显著提升检测精度。。创建模块代码注册模块修改任务解析tasks.py创建YAML配置文件模块核心优势适用场景计算开销SOCA捕获二阶统计信息,增强通道间相关性需要精细特征区分的场景中等SK自适应多尺度核选择多尺度目标检测中等偏高显式特征聚集-分配机制全局上下文建模中等A2-Net双线性注意力,高效全局交互复杂场景理解中等偏高CrissCross线性复杂度全局上下文高分辨率输入,长距离依赖较低。

u012133341的博客 2257

算法总结-图论-最短路径(Dijkstra算法/Bellman-Ford算法/Floyd-Warshall算法)

本文主要总结了 Dijkstra 算法、Bellman-Ford 算法、Floyd-Warshall 算法三种常见的求最短路径算法的基本原理、代码实现以及正确性证明,并在文末附有少量例题和参考文献,方便深入理解和巩固最短路径有关算法。

m0_72786913的博客 1591

具身智能(26):RDK S100的LeRobot或Agile X piper机械臂控制模型

本文档详细介绍了基于ROS2的机器人控制模型架构与标定数据联动机制。核心采用"感知-规划-控制"闭环流程,通过激光雷达、相机和IMU的融合数据实现厘米级定位(≤1cm)。文档包含两大控制模型配置:1)RDKLeRobot模型,重点说明PID参数调节和标定文件路径设置;2)AgileXPiper模型,强调驱动安装与外部标定文件集成。针对常见问题提供解决方案,如控制指令无响应需验证标定路径,运动偏差过大需重新标定等。最后给出批量部署方案,通过复制基准配置文件实现多机器人快速配置,要求定位偏差

码农17年的博客 178

图论(二)之最短路问题

https://www.acwing.com/problem/content/851/https://www.acwing.com/problem/content/852/迪杰斯特拉算法采用的是一种贪心的策略。求源点到其余各点的最短距离步骤如下:遍历 dist 数组,找到一个节点,这个节点是:没有确定最短路径的节点中距离源点最近的点。假设该节点编号为 i。此时就找到了源点到该节点的最短距离,state[i] 置为 1。遍历 i 所有可以到达的节点 j,如果 dist[j] 大于 dist[i] 加上 i -

三分梦的博客 2431

图解联合概率密度、边缘概率密度、条件概率密度之间的关系

简要图解联合概率密度、边缘概率密度、条件概率密度之间的关系

一个搬运知识的笨小孩 2万+

C++和OpenGL实现3D游戏编程【连载6】——不规则图形的纹理贴图(附源码)

上一节我们讨论了纹理贴图的相关基础操作,但上一节的纹理贴图操作基本上都是规则图形,包括圆形和球形虽然复杂一点,但是它也是规则的。这一节课我们要讨论一下,怎么在不规则图形上纹理贴图,就比如文章下图的心形纹理贴图,以及纹理的平移、旋转、放大缩小功能。

zhooyu的博客 1308

Dijkstra算法

Dijkstra以及优化版

qq_63961708的博客 314

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数据结构(十一)----图的应用

数据结构(十一)----图和有向无环图的应用 一.最小生成树 1.Prim算法(普里姆) 2.Kruskal算法(克鲁斯卡尔): 二.最短路径(BFS算法) 1.单源最短路径 (1)BFS算法(无权图) (2)Dijkstra算法(带权图,无权图) 2.各顶点间的最短路径 (1)Floyd(带权图,无权图) 三.有向无环图(DAG) 1.算术表达式 2.拓扑排序 •逆拓扑排序 3.关键路径

weixin_69884785的博客 2576

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Dijkstra

最短路径 dijkstra 不可解决有负权的图 但是若是没有负权的话,最好用这个,而不要用spfa,因为spfa的时间复杂度极其不稳定 对于稀疏图来说,spfa的时间复杂度确实是要比dijkstra要低 但,若是稠密图的话,spfa的时间复杂度就极其不可观了 所以,dijkstra的重要性显然 1.定义     不可解决有负权边的图     时间复杂度为O(...

weixin_30505043的博客 113

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

最短路算法

雪白的天色忽尔就炎夏飞鸟想飞走甚至不喧哗眼睛要流泪蜡烛要融化何必要不疑有他。

ZZZS0516的博客 733

dijikstra详解 [单源最短路]

堆优化版dijikstra事实上就是使用优先队列优化了找寻dis数组中的最小值的步骤,将O(n)的查询复杂度降为了O(nlogn),显著提升了代码的速度.这也是最常用的dijikstra版本.其中最容易错的步骤就是优先队列的创造以及入队判定.dijikstra算法,又称为单源最短路算法,是一种高效的求出一个点到其他点的最短(或最长)距离的算法. 这个算法最大的问题就是其无法处理拥有负权值的图.该算法共有两种方法,第一种为普通版(复杂度O(设该点为u,连接的点为v,连接两点的边的边权为w.

Juan_2012的博客 1381

最短路径问题

【代码】最短路径问题。

2401_88301466的博客 547

最短路入门

Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。 问题描述:在无向图 G=(V,E) 中...

博採眾長 1万+

王道计算机408数据结构 笔记21

6.4.3 最短路径问题_Dijkstra算法 6.4.4 最短路径问题_Floyd算法

Scott_wuu的博客 429

数据结构笔记chapter06_4_2_最短路径问题

1. BFS算法 2. Dijkstra算法 3. Floyd算法 最短路径问题: (1)单源最短路径问题:BFS算法(无权图)、Dijkstra算法(带权图、无权图) (2)每对顶点间的最短路径: Floyd算法( 带权 图、无权图) 1. BFS算法:求⽆权图的单源最短路径 (1)⽆权图可以视为⼀种特殊的带权图,只是每条边的权值都为1 (2)代码实现 //求顶点u到其他顶点的最短路径 void BFS_MIN_Distance(Graph G,int u){

qq_41994825的博客 1879

<<最短路径>>

一.问题引入 问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径——最短路径。解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法,另外还有著名的启发式搜索算法A*,不过A*准备单独出一篇,其中Floyd算法可以求解任意两点间的最短路径的长度。笔者认为任意一个最短路算法都是基于这样一个事实:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点到B。 二.Dijk

liucinxi的博客 797
上一篇: python - 文件操作教程
下一篇: c++实现线程池(真实入门!)
Korpse
博客等级 码龄9年 115粉丝 25原创
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值