Dijkstra无法处理负权边的原因

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

为啥不能处理负权?
  首先我们要清楚一个点:Dijkstra是每次贪心的选择跟当前邻接的点,而不会去考虑处邻接之外的其他点

而如果所有Dijkstra算法适用于不存在负权边的图(有无向均可),这个是因为迪杰斯特拉算法是基于贪心策略,每次都找一个距源点最近的点,然后将该距离定为这个点到源点的最短路径;但如果存在负权边,那么直接得到的最短路不一定是最短路径,因为可能先通过并不是距源点最近的一个次优点,再通过一个负权边,使得路径之和更小,这样就出现了错误。如下:

1——>2权值为5,1——>3权值为6,3——>2权值为-2,求1到2的最短路径时,Dijkstra就会选择权为5的1——>2,但实际上1——>3——>2才是最优的结果。

另外如果包含负环,则意味着最短路径不存在。因为只要在负权回路上不断兜圈子,所得的最短路长度可以任意小。负数的绝对值越大,该值就越小。

从地图导航到网络路由:深入聊聊Dijkstra算法的“不能”与“能”(附负权边真实案例) 本文深入探讨了Dijkstra算法在单源最短路径问题中的应用与局限。作为图论中的经典算法,Dijkstra在GPS导航和网络路由中表现卓越,但其无法处理负权边的特性也值得注意。文章通过真实案例分析了算法失效原因,并对比介绍了Bellman-Ford等替代方案,帮助开发者根据场景选择最优路径算法。 阅读详情

相关推荐

用‘多米诺骨牌’和‘问路警察’来理解Dijkstra和Bellman-Ford:图解最短路核心思想

本文通过生动的多米诺骨牌和问路警察比喻,深入浅出地讲解了Dijkstra和Bellman-Ford两种最短路算法的核心思想。详细对比了它们在处理负权边、时间复杂度等方面的差异,并提供了实际应用场景和优化建议,帮助读者掌握这两种经典算法的工作原理和实现技巧。

weixin_42638178的博客 342

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

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

highlighters的博客 9271

(1-5)

Dijkstra算法是一种经典的图算法,用于求解单源最短路径问题。然而,它也有一些局限性,而一些改进算法针对这些局限性进行了优化。

码农三叔 3836

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

Dijkstra算法是贪心算法,大概前提是,从当前的所有可能中就能找到全局的最优解,而负权图不满足这个条件(比如本文末尾的图例) 让我们从它的算法步骤上仔细分析一下:(如果需要算法详解点这里)     1.将图上的初始点看作一个集合S,其它点看作另一个集合     2.根据初始点,求出其它点到初始点的距离d[i] (若相邻, 则d[i]为边权值;若不相邻,则d[i]为无限大...

Kprogram的博客 2万+

最短路径:Dijkstra算法

Dijkstra算法是求解单源最短路径的经典贪心算法,适用于带权无负权边的图。其核心思想是逐步确定起点到各顶点的最短距离:每次选择未确定顶点中距离最小的,用它更新邻接点的距离。因贪心策略假设一旦确定最短路径便不再改变,故无法处理负权边。时间复杂度为O(n²)(邻接矩阵)或O((n+e)log n)(堆优化),广泛应用于导航、快递路径规划等场景。

通俗易懂学IT 16

表格数据学习的图神经网络综述

今天学习一篇发表在中科院一区期刊《ACM Computing Surveys》的综述文章《Graph Neural Networks for Tabular Data Learning: A Survey with Taxonomy & Directions》,该刊主要刊载计算机理论方法领域的系统性综述与教程论文,注重跨学科技术融合研究,最新的影响因子为28.0。本文的目的在于通过学习这篇文章,了解关于表格数据学习点图神经网络一些基础知识。

qq_41009600的博客 799

Dijkstra算法不能解决负权边的问题

Dijkstra算法不能解决负权边的问题

qq_52905520的博客 5451

华为云Stack 8.X 流量模型分析(一)

​ 当内部需要提供对外服务时(如对外发布Web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。​ 内部地址要访问公网上的服务时(如Web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。

Ciyaso的博客 3243

我终于搞懂了:为什么 Dijkstra 不能处理负权边?

如果你也曾遇到类似情况:刷题时算法跑出来不对老师一句话让你死记别急,这篇文章希望能帮你少走弯路。记住:Dijkstra:非负权图,贪心策略成立SPFA:支持负权,松弛不断更新理解原理 > 记公式最后,算法学习就像生活,有时候你做选择前,要先问自己:“这个选择真的不会被后悔吗?在图论里,这句话就是 Dijkstra 的核心。真实踩坑经历生活类比帮助理解完整可运行代码面试思考点总结读者能学到原理 + 写法 + 思考方式,一篇文章就够用了。

lihaoweiwudi_的博客 632

Python3.11安装fairseq避坑指南:解决dataclasses兼容性问题(附详细代码修改)

本文详细解析了在Python 3.11环境下安装Fairseq时因dataclasses模块规则变更导致的安装失败问题。通过定位核心配置文件,将`default=SomeConfig()`修改为`default_factory=SomeConfig`,并调整依赖版本,提供了从源码修改到环境验证的完整解决方案,确保Fairseq顺利运行。

weixin_29098367的博客 494

海康摄像头V3.4 升级改造VUE3

摘要:本文介绍了一个基于Vue3的海康威视摄像头组件封装方案。针对官方仅提供HTML版本SDK的问题,作者通过封装实现了Vue3组件化集成,解决了iframe/webview引入方式的弊端。组件核心功能包括实时预览、本地录像、录像下载、截图抓拍等,并优化了SDK初始化逻辑(单例模式)、定位问题修复和错误处理机制。关键技术点包括:1)SDK插件容器定位修复;2)录像下载进度监控;3)多格式图片数据处理;4)多窗口场景下的SDK实例管理。该组件可直接通过npm安装使用,提供了完善的API和事件接口,显著提升了海

LINLINLINShi的博客 113

关于普通dij算法为什么不能解决负权边的分析

我们首先来分析下含负权边的无向图: 1.先看图 我们求A点到C点的最短距离,很明显答案为1. 2.我们用dij来跑下,看过程: 先把A点标记哈,不需要访问本身 首先找到距A最近的且直接相连的点(也就是两点间没有中转点)C,把C标记哈 找出C点的出点A,,B,A被标记了不管,此时A到B的距离为3,大于A到C的距离加上C到B的距离0,所以更新A到B的距离为0 更新后A到C的距离仍然为2,A到B

zhishuang.rao的博客 6040

CMake、Make、MinGw、Clang、Llvm、GCC、MSVC的区别

除开 GCC (GNU 编译器集合) 以外,MinGW 还包含有一些其他的 GNU 程序开发工具;的缩写,MinGw是windows版本的gcc集合。并不仅是一个 C/C++ 编译器,而是一套。是微软开发的VC运行时库,3、Make和CMake是。

m0_37698164的博客 1万+

Dijkstra算法为什么不能处理负权边?深入解析贪心策略的局限性

本文深入解析了Dijkstra算法无法处理负权边的根本原因,揭示了其贪心策略的局限性。通过具体反例和算法流程剖析,说明了负权边如何破坏算法的核心假设,并探讨了Bellman-Ford等替代方案在实际工程中的应用场景与选择策略。

weixin_29268267的博客 288

Qt 文件对话框(QFileDialog)实战指南 —— 从基础到高级应用

本文是Qt文件对话框(QFileDialog)的实战指南,从基础静态函数调用到高级对象模式应用,全面解析了文件选择、保存、目录选取及多选等核心功能。文章深入探讨了MIME类型过滤、自定义侧边栏、信号槽实时响应及状态持久化等高级技巧,并提供了跨平台开发中的避坑指南与最佳实践,帮助开发者高效、稳健地集成文件操作功能。

weixin_29306261的博客 376

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

曼岛_的博客 631

Dijkstra不能得到含有负权边图的单源最短路径

对于不含负权边的图求单源最短路径,Dijkstra算法是最高效的。但是在含负权边的图中,Dijkstra很可能得不到正确的结果,因为Dijkstra每次选的是当前能连到的边中权值最小的,在正权图中这种贪心是对的,但是在负权图中就不是这样了。比如1——>2权值为5,1——>3权值为6,3——>2权值为-2,求1到2的最短路径时,Dijkstra就会选择权为5的1——>2,但实际上1——>3——>2才

yellowscenery的专栏 1548

深入剖析RK3588系统休眠唤醒机制及驱动适配秘籍

本文深入探讨了RK3588嵌入式系统的休眠唤醒机制及驱动适配技术。首先分析了系统支持的两种休眠模式(Freeze浅度睡眠和Mem深度睡眠)及四种唤醒方式(GPIO中断、蓝牙事件、外设活动和定时器唤醒)的工作原理。重点介绍了驱动适配的三个关键环节:设备树配置要点、驱动代码实现与优化方法,以及驱动与内核电源管理的协同机制。通过GPIO按键唤醒和蓝牙唤醒两个实际案例,展示了具体实现过程并提供了常见问题的解决方案。文章为开发者提供了全面的技术参考,有助于优化系统功耗管理和响应性能,对嵌入式系统开发具有重要指导意义。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 433

dijkstra算法为什么不能处理带有负边权的图

1 2 3 1 0 8 9 2 10 0 10 3 10 -2 0 先看样例再解释,看邻接矩阵会发现, 如果用dijkstra算1-2的最短路因为贪心思想所以得到的结果是8,但明显可以看到1-3-2最短,结果为7;这是为什么呢? 因为dijkstra用了贪心的思想,每次选取的是当前最...

weixin_30950237的博客 252

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

dijkstra,bellman-ford,floyd分析比较

http://www.cnblogs.com/mengxm-lincf/archive/2012/02/11/2346288.html 其实我一直存在疑惑是什么导致dijkstra不能处理负权图? 今日偶见某大牛说一句“dijkstra选定一个节点后节点值不在改变”,方才大悟。 本质上就是dijkstra选点方式导致的(即贪心),只针对目前的情况作出最好的判断 1)在非

xlc2845的专栏 942

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...

Dijkstra算法+递归(上)

Dijkstra算法 用于在非负加权图中查找最短路径 代码如下: import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Scanner; import java.util.Stack; public class Didala { private...

weixin_39670158的博客 928

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

(总结) 关于Dijkstra的一些看法

1)Dijkstra算法只能适用于权为正的图,有向图和无向图都可以用。 2)Dijkstra算法在权为正的图中,如果图恰好是环,那Dijkstra算法也能用,还可以输出最短路。 3)Dijkstra算法的本质是贪心,但是,这个可以求出最优解。它和Prim算法是不同的,尽管它们的在核心代码上是基本相似的,但是仍有一些不同的地方。 3)面对存在负权的图中,Dijkstra不能用了,因为...

656

Dijkstra - 单源最短路径_之2(无注释版)

算法:Dijkstra [堆优化(优先队列)]求解:单源最短路径核心思想:贪心,每次从未确定最短距离的节点中,选择距离源点最近的节点,用该节点更新其邻接点的距离。实现。

YYDS314的博客 750

Dijkstra算法实战:从原理到Python实现(附可视化与优化技巧)

本文详细解析了Dijkstra算法的原理及其在Python中的实现,包括最短路径计算、贪心策略应用和性能优化技巧。通过示例代码和可视化展示,帮助开发者掌握这一经典算法,适用于物流配送、游戏寻路和网络路由等场景。

weixin_29214559的博客 380

C++基础算法10:Bellman_Ford

Bellman_Ford求解单源最短路径,带负边

ccrr7的博客 779
上一篇: 分解质因数模板
下一篇: 最小生成树
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值