具有负权重的 Dijkstra 算法

2024-02-14

我们可以使用具有负权重的 Dijkstra 算法吗?

STOP!在你认为“哈哈,你可以在两点之间无休止地跳跃并获得一条无限便宜的路径”之前,我更倾向于考虑单向路径。

其应用是具有点的山区地形。显然,从高到低并不需要能量,事实上,它会产生能量(因此是负路径权重)!但再回去就不行了,除非你是查克·诺里斯。

我正在考虑增加所有点的权重,直到它们为非负数,但我不确定这是否有效。


只要图不包含负环(边权重和为负的有向环),任意两点之间就会有一条最短路径,但 Dijkstra 算法并不是为了找到它们而设计的。在具有负边权重的有向图中查找单源最短路径的最著名算法是贝尔曼-福特算法 http://en.wikipedia.org/wiki/Bellman-Ford_algorithm。然而,这是有代价的:贝尔曼-福特需要 O(|V|·|E|) 时间,而迪克斯特拉氏 http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm需要 O(|E| + |V|log|V|) 时间,对于稀疏图(其中 E 为 O(|V|))和稠密图(其中 E 为 O(|V|^2 ))。

在您的山区地形示例中(必然是有向图 http://en.wikipedia.org/wiki/Directed_graph,因为上下斜坡有不同的权重)不存在负循环的可能性,因为这意味着离开一个点,然后以净能量增益返回到该点 - 这可以用来创建一个永动机 http://en.wikipedia.org/wiki/Perpetual_motion.

将所有权重增加一个常数值以使它们成为非负值是行不通的。要了解这一点,请考虑以下图形,其中从 A 到 B 有两条路径,一条路径穿过长度为 2 的单条边,一条穿过长度为 1、1 和 -2 的边。第二条路径较短,但如果将所有边权重增加 2,则第一条路径现在的长度为 4,第二条路径的长度为 6,从而反转最短路径。仅当两点之间的所有可能路径都使用相同数量的边时,此策略才有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有负权重的 Dijkstra 算法 的相关文章

  • 最短路径算法(Dijkstra)

    一 前言 最短路径算法 xff0c 顾名思义就是求解某点到某点的最短的距离 消耗 费用等等 xff0c 有各种各样的描述 xff0c 在地图上看 xff0c 可以说是图上一个地点到达另外一个地点的最短的距离 比方说 xff0c 我们把地图上
  • WEEK(7)作业——最短路专题(Floyd、Dijkstra、SPFA、负权环路)

    A TT的魔法猫 题目描述 众所周知 xff0c TT 有一只魔法猫 这一天 xff0c TT 正在专心致志地玩 猫和老鼠 游戏 xff0c 然而比赛还没开始 xff0c 聪明的魔法猫便告诉了 TT 比赛的最终结果 TT 非常诧异 xff0
  • Dijkstra算法——java实现

    面试时遇到Dijkstra算法 这个算法我是知道的 但是没具体写过 所以答题比较慢 抽时间实现了下这个算法 nbsp Dijkstra算法基本思路 该算法的基本思路是这样的 从起始点开始 将未访问过的相邻节点加入一个优先队列 类似于广度优先
  • 数据结构——迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉算法又叫狄克斯特拉算法 是从一个顶点到其余各顶点的最短路径算法 解决的是有权图中最短路径问题 迪杰斯特拉算法主要特点是从起始点开始 采用贪心算法的策略 每次遍历到始点距离最近且未访问过的顶点的邻接节点 直到扩展到终点为止 以下是数
  • 迪杰斯特拉(Dijkstra)算法

    一 算法介绍 迪杰斯特拉算法是由荷兰计算机科学家在1956年发现的算法 此算法使用类似广度优先搜索的方法解决了带权图的单源最短路径问题 它是一个贪心算法 二 核心思想 1 选定一个点 这个点满足两个条件 1 未被选过 2 距离最短 2 对于
  • Dijkstra算法和Floyd算法对比分析

    转载 http blog csdn net liuyanling cs article details 56330652 首先 Dijkstra算法与Floyd算法都是广度优先搜索的算法 都可以用来求单源点到其他所有点的最短路径 那么这两者
  • 轻松学懂图(下)——Dijkstra和Bellman-Ford算法

    概述 在上一篇文章中讲述了Kruskal和Prim算法 用于得到最小生成树 今天将会介绍两种得到最短路径的算法 Dijlkstra和Bellman Ford算法 Dijkstra算法 算法的特点 属于单源最短路径算法 什么是单源呢 通俗的说
  • 图论 笔记

    关于存图 如果是有权值的边 可以用pair define pii pair
  • 最短路径——Dijkstra算法(C语言实现)

    最短路径 Dijkstra算法 基本概念 1 最短路径 非带权图 边数最少的路径 带权图 边上的权值之和最少的路径 基本思想 1 v 源点 S 已经生成最短路径的终点 w
  • Dijkstra算法:如果有两个或多个权重最小的节点怎么办?

    在 Dijkstra 算法中 如果算法中的某个点有两个或多个权重最小的节点 我该怎么办 在维基百科中 http en wikipedia org wiki Dijkstra 27s algorithm在步骤号 6 它说 将暂定距离最小的未访
  • 使用 Dijkstra 算法寻找最短路径

    我需要找到图的两个顶点之间的最短路线 我有一个矩阵 其中包含所有权重 我该怎么做 目前 我有以下代码 private int Dijkstra int start int end bool done new bool 8 int paren
  • “双图”中变化次数有限的最短路径

    假设我们在一组顶点上有两个有向正权图 第一个图代表铁路 第二个图代表公交车道 顶点是公交车站或火车站或两者 我们需要找到从 A 到 B 的最短路径 但我们不能改变交通工具类型超过 N 次 我试图修改 Dijkstra 算法 但它只适用于一些
  • 健康损失的迷宫中的最短路径

    假设您有一个由 2D 矩阵表示的地下城 您有一个起点 S x1 y1 和一个终点 E x2 y2 在此过程中 一些细胞中会有一个数字 这些数字会从您的健康得分中减去 其他细胞是你无法跨越的障碍 你一开始有 5 点生命值 你需要找到从 S 到
  • Java:使用 Fibonacci 堆实现 Dijkstra 算法

    新来的 但已经作为客人潜伏了一段时间了 好的 所以我一直在尝试使用 Fibonacci 堆 在 Java 中 执行 Dijkstra 的最短路径算法 经过一番搜索 我偶然发现了两个代表斐波那契堆的现成实现 第一个实现做得相当漂亮 可以找到h
  • 带优先级队列的 Dijkstra 算法

    在我的 Dijkstra 算法的实现中 我有 1 个包含所有节点的数组和 1 个包含所有节点的优先级队列 每当一个节点出队时 我都会用新的距离和它的来源更新所有相邻节点 这样我就可以回溯路径 优先级队列中的节点将更新为新距离 数组中的节点将
  • 网格中两点之间的最短路径。有一个捕获

    我遇到这个问题 我必须通过向右或向下移动来找到 NxM 网格中从 A 点 总是左上角 到 B 点 总是右下角 的最短路径 听起来很容易 是吗 问题是 我只能移动我现在坐在的图块上显示的数字 让我举例说明 2 5 1 2 9 2 5 3 3
  • 在Python中找到英文维基百科中两篇文章之间的最短路径

    问题 在英文维基百科中查找两篇文章之间的最短路径 如果存在文章 C i 并且文章 A 中存在指向文章 C 1 的链接 文章 C 1 中存在指向文章 C 2 的链接 则文章 A 和 B 之间存在路径 在文章 C n 中是指向文章 B 的链接
  • Dijkstra最短路径算法

    以下是我们教授给我们的算法摘要 步骤 3 中提到的图中节点的父节点是什么 我有点困惑 因为我认为节点只有邻居而没有父节点 我的第二个问题是关于第 3 步 拾取堆栈中的第索引条记录 由于堆栈只允许您查看顶部 所以我不确定拾取第索引记录意味着什
  • 原始地理坐标和图形节点之间的最短路径

    我已经实现了一个简单的 Dijkstra 算法 用于使用 Java 查找 osm 地图上的最短路径 从 osm 文件创建的图形中的寻路效果非常好 但是 如果用户的当前位置和 或目的地不是该图的节点 只是原始坐标 我们如何将这些坐标 链接 到
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询

随机推荐

  • Flutter:读取 BloC 状态的 Stream 数据,如果发生变化则重新渲染 UI

    我在使用 BloC 模式并结合使用 Dio 显示下载过程时遇到问题 谁能告诉我 如何从 dio 获取 onUploadProgress 进入块状态并在状态内的进度更新时显示它 目前我有 UI BloC 和 API 类 我需要将我的块传递到
  • 在 Woocommerce 中更改移动设备上的 FlexSlider 选项

    默认情况下 在单个产品页面上启用选项 controlNav 缩略图 桌面版没问题 但在移动设备上我希望 controlNav true 点 我尝试使用 ajax 来完成此操作 但我认为我需要以某种方式使用 Flex 幻灯片刷新该片段以应用过
  • 我应该对 UDP 使用(非阻塞)NIO 吗?

    根据这个帖子 https stackoverflow com questions 569555 non blocking udp i o vs blocking udp i o in java UDP 只是不阻塞 使用 非阻塞 NIO AP
  • 如何通过 UTC 偏移量确定时区?

    我有一个场景 我有一个时区偏移 以分钟为单位 需要确定它的时区 我知道所有数据都不可用 例如 可能有几个时区的偏移量为 240 分钟 但 最佳猜测 是可以接受的 我的第一遍看起来像这样 foreach var info in TimeZon
  • 无法让 Django/Postgres 应用程序设置在 Heroku 上运行

    我正在使用 Two Scoops of Django 模板制作一个 Django 应用程序 收到此 Heroku 错误 我的 Postgres 生产设置是否已关闭 操作错误 无法连接到服务器 连接被拒绝 服务器是否在主机 localhost
  • 如何向弹出窗口添加页脚并使内容可滚动?使用 Twitter 引导程序 3

    这是图片 我必须做的 如何向弹出窗口添加页脚并使内容可滚动 使用 Twitter 引导程序 3 要创建带页脚的弹出窗口 您必须更改弹出窗口template并添加一些 CSS 来设置页脚的样式 在这里 我还在页脚中放置了一个按钮 正如您在绘图
  • 毛里求斯国旗问题

    我已经为该问题制定了解决方案荷兰国旗问题 http en wikipedia org wiki Dutch national flag problem已经 但这一次 我想尝试一些更困难的事情 毛里求斯国旗问题 4 种颜色 而不是 3 种 对
  • 用逗号格式化json文件?

    我有一个 json 文件 bla bla bla bla bla bla bla bla 如何将它们格式化为有效的 json 类型 例如 bla bla bla bla bla bla bla bla bla bla 每个后面插入逗号 除了
  • Python中如何查找引发异常的位置

    如何确定在哪个函数中引发了异常 例如存在两个函数 foo 和 bar 在 foo 中 异常将随机引发 import random def foo if random randint 1 10 2 raise Exception bar de
  • 在doctrine2中是否可以有一个不是主键的自动增量列?

    在doctrine2中 我有一个实体 它有一个从Web服务提供的主键 并且还有一个应该是自动增量的索引 我可以在mysql中手动设置 但无法在doctrine2中进行此设置 I used columnDefinition of INT AU
  • Windbg lm:“延迟”是什么意思?

    我正在 WinDbg 中调试 NET 2 0 程序集的故障转储文件 当我在 WinDbg 中输入 lm 时 我会得到一长串已加载的模块 如下所示 723c0000 72950000 mscorwks deferred 这里的 延期 是什么意
  • 接口和@RequestBody

    我目前正在开发一个项目 该项目允许用户 通过网络 预订在给定时间段内使用所选资源 在这个程序中 我试图遵循 Spring 的接口编程哲学 以及一般的最佳实践 因此我尝试在具体类中重复功能的任何地方使用接口 我创建的一个接口称为 Bookab
  • 当我从 Process.Start(url) 打开 url 时,c# Google chrome 在某些 PC 上崩溃

    在某些 PC 上 当我想显示网址时 Google Chrome 会崩溃 我用了Process Start url and UseShellExecute true 请注意 它在我尝试过的大多数电脑上都能正常工作 但在某些电脑上却不能 Chr
  • 使用 requirejs + uglify 限制行长度

    我们正在使用requirejs optimize config 在我们的构建脚本中使用 uglify2 来缩小我们的生产 JavaScript 代码 我们希望将缩小后的行长度限制为大约 80 个字符 这样即使在生产代码中也可以更轻松地调试
  • Angular 5 中 value 和 ngValue 的区别

    今天 我意识到 Angular 5 中的反应式表单出现了意外的 对我来说 行为 服务器从应用程序接收到一个值为 null 的字符串 而不是我想要的 null 值 我做了以下测试 https stackblitz com edit angul
  • 如何减少 androidx.compose.material3.OutlinedTextField 的高度

    我在降低高度时遇到困难OutlinedTextField在撰写中 我正在尝试在里面做一个搜索栏TopAppBar就像许多谷歌应用程序 Gmail Play Store 中所做的那样 我无法在材料3中实现这一点 我尝试复制OutlinedTe
  • Chrome扩展从内容脚本到后台html的sendMessage错误

    我刚刚将我的 chrome 扩展更新为 json 版本 2 并尝试让我的扩展再次工作 问题是 sendRequest 一路上被贬值了 所以我复制代码https developer chrome com extensions messagin
  • 确定 C 可执行文件名称

    当我们编译 C 程序时 输出存储在 a out 中 我们如何将编译后的输出重定向到另一个文件 大多数 C 编译器为此提供了一个选项 例如 o选项gcc和其他一些 gcc o gentext gentext c cc o mainprog L
  • 如何获取neo4j路径中的最后一个节点?

    在这个密码查询中 将返回与 STATUS on 属性有关系的节点之间的最长路径 但我还想获取路径的最后一个节点 query START n node MATCH p n rels INCLUDE gt m WHERE ALL rel IN
  • 具有负权重的 Dijkstra 算法

    我们可以使用具有负权重的 Dijkstra 算法吗 STOP 在你认为 哈哈 你可以在两点之间无休止地跳跃并获得一条无限便宜的路径 之前 我更倾向于考虑单向路径 其应用是具有点的山区地形 显然 从高到低并不需要能量 事实上 它会产生能量 因