实施 Dijkstra 算法

2024-03-28

我的任务是(大学课程)实施某种形式的寻路。现在,在规范中,我可以实现强力,因为要搜索的节点数量有限制(开始,中间两个,结束),但我想重新使用此代码并来实现迪杰斯特拉算法 http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm.

我在维基百科上看到了伪内容,一位朋友也为我写了一些,但它完全没有意义。这个算法看起来很简单,理解它对我来说不是问题,但我一生都无法想象实现这样的事情的代码。

有什么建议/提示吗?

编辑一些混淆:
是的,有一个目标节点和一个源节点。
我希望在一般情况下实现 Dijkstra,而不是“只有两个中间站”的情况,因为我想在之后再次使用该代码。否则,我只会编写一个强力实现。
我遇到的具体问题是存储次优的半成形路径,以防它们变得最优。当我访问给定节点时,我只是不知道如何更新通过该节点的所有连接。
更多编辑:
现在浏览几个答案并尝试一下。

真正编辑: 我忘了提到一个严重的复杂情况,即任何两个顶点之间的距离最多可达 UINT_MAX 。对不起。事实上,我忘记处理这个问题可能首先就是导致该死问题的原因,尽管解决方案:幸运的是,选择最短的对我来说是显而易见的。难怪其他人的伪距离变量没有考虑到我的可变距离。


以下是 Dijkstra 算法的高级分解:

将所有顶点放入优先级队列中,其中所有顶点的优先级(距离)均为无穷大except对于源顶点,其距离为零(源顶点与其自身的距离为零,对吗?)。

弹出优先级队列。移除的顶点是距源距离最短的顶点。显然,从队列中弹出的第一个顶点是源。我们称那个弹出的顶点为v.

看看每个邻居v。它们的距离都大于v的距离(否则我们已经把它们从队列中弹出了,对吧?)。比方说v距离为 3,并且v有 3 个邻居x(距源的距离:5),y(距源的距离:10)和z(距源的距离:无穷大)。

现在我们看看每个邻居的距离v。假设它们是:x - 3, y - 2, z- 4. 这意味着从源到的路径x那个经过v距离为 |v| + 3 (3 + 3 = 6),y距离为 5 (3 + 2 = 5),z 距离为 7 (3 + 4 = 7)。

通往的路径x通过v比当前最短路径长x所以我们忽略它。然而,路径y and z那些经过v比之前已知的最短路径短,因此我们更新它们。

继续这样做,直到遍历完所有顶点。在每个点,当您从优先级队列中弹出最小值时,您就知道您已经找到了到该顶点的最短路径,因为任何可能的较短路径必须经过距离小于的顶点v's,这意味着我们已经将其从队列中弹出。

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

实施 Dijkstra 算法 的相关文章

随机推荐

  • WCF @ServiceHost 调试=“true”但 web.config 编译=“false”

    我一直在查看 MSDN 文档 但没有找到具体的答案 ServiceHost 中的 Debug 属性是否会覆盖 Web config 的编译属性 还是 web config 属性会覆盖所有属性 Thanks 根据 http msdn micr
  • 将多条记录合并到表中的一行中

    我有一个表 其中有多个相同销售代理 ID 但不同销售额的记录 如何删除多行并仅获得总值的聚合 例如 我们假设表结构如下 SalesAgentId SalesAgentName SalesAmount 111 John Doe 8437 00
  • 使用可传输对象调用 postMessage 时,MessageChannel port.postMessage 的数据为空?

    我正在学习关于消息通道 http dev opera com articles view window postmessage messagechannel channel and 可转让物品 https developer mozilla
  • HABTM 连接表上需要两个索引吗?

    一个简单的has and belongs to many协会 Person has and belongs to many products Product has and belongs to many persons Are both以
  • MySQL:如果外键存在则插入

    我有一个包含大约 2000 行的 Excel 工作表 我想将其插入到数据库中 问题是我想要插入 2 000 行的表有一列引用了另一个表中的外键 不幸的是 许多查询失败 因为提供的外键值不存在 我知道我可以忽略外键检查 但这不是我想要的 我不
  • 在地图上绘制坐标

    我正在尝试使用 R 绘制我的坐标 我已经尝试遵循不同的帖子 R 在世界地图上绘制分组坐标 https stackoverflow com questions 16234092 r plot grouped coordinates on wo
  • 我可以在 Rust 中定义一个带有自身类型参数的特征吗?

    我是 Rust 新手 在处理特征和泛型方面遇到困难 我首先定义一个特征来为我做一些工作 然后定义一个将其用作类型参数的通用结构 现在我意识到 在原始特征中 我实际上想使用我定义的结构 所以我处于一种循环中 我不知道如何摆脱它 并且想知道我想
  • ssh -vT [电子邮件受保护] 的权限被拒绝(公钥)错误

    安装了 Git 并创建了与 Facebook 应用程序一起使用的 heroku 帐户 无法与github建立连接 使用windows Git命令提示符将文件克隆到本地windows 7 输出如下 ssh vT email protected
  • Windows 7 操作中心

    如果有人可以指导我修改 控制 Windows 7 操作中心所需的新 MS API 我将不胜感激 我需要做的是将备份通知消息集成到我的应用程序中 该应用程序是操作中心的备份应用程序 换句话说 我希望Windows在第三方软件完成备份操作后显示
  • 使用 jQuery 从 'a' 元素的 'href' 属性中剪切文件名的最佳方法是什么?

    例如我有简单的代码 ul class list li a href http www aaa com bbb ccc file01 pdf Download file 01 a li li a href http www bbb com c
  • 我可以删除弹出视图中的箭头吗?

    我被要求删除弹出视图的箭头 这是否违反了人机界面准则 在另一个弹出窗口中显示一个弹出窗口是否明智 如果不违反人机界面准则怎么办 对于斯威夫特 popoverMenuViewController permittedArrowDirection
  • 在 vscode 中将现有 Java 项目转换为 Maven

    我有一个没有任何东西的旧Java项目 我想使用maven 因为缺少一些依赖项并且我找不到库 有人可以告诉我如何将该项目转换为 MavenWITH VSCODE 以下是一些步骤 告诉 VS Code使用Maven https code vis
  • 如何获取最顶层活动的标识符?

    我有一个服务 当最顶层的 Activity 发生变化时 它的行为必须改变 假设 活动 A 处于活动状态 然后服务开始某种处理 当 Activity A 不再可见时 此处理必须停止 用户按下 后退 主页 或执行任何其他操作使 Activity
  • MySQL 记录 UPDATE 应该会失败,但实际上却没有。为什么?

    这是一个有趣的情况 我用 MySQL 开始一个事务 我的交易涉及3个相关查询 每个查询都必须成功 如果没有成功 则不应将任何查询写入数据库 现在 故意 对于第二个查询 这恰好是一个更新查询 我改变了 标识要更新为无效 不存在 PK 值的记录
  • 在散点图中将值绘制为符号的最简单方法?

    在回答我之前关于修复 4D 数据散点图像的色彩空间的问题时 Tom10 建议将值绘制为符号 以便仔细检查我的数据 一个好主意 我过去运行过一些类似的演示 但我一生都找不到我记得的演示非常简单 那么 将数值绘制为散点图中的符号 而不是 o 的
  • IPv6 地址的正则表达式

    我有一个 IPv6 地址的正则表达式 如下所示 IPV4ADDRESS t digit 1 3 3 digit 1 3 t x4 xdigit 1 4 xseq x4 x4 0 7 xpart xseq xseq xseq xseq IPV
  • Scala sbt:sbt 中的多个依赖项

    我是 Scala 的新用户 正在按照创建 scala sbt 项目的方式进行操作 https www youtube com watch v Ok7gYD1VbNw https www youtube com watch v Ok7gYD1
  • 如何在shell中剪切字符串的第一列(可变长度)

    如何在shell中剪切字符串的第一列 可变长度 字符串的前 23006 帮助 txt 我需要 23006 作为输出 很多方法 cut d f1
  • 为什么我的 WebClient 大多数时候会返回 404 错误,但并非总是如此?

    我想要获取有关我的程序中的 Microsoft 更新的信息 但是 服务器在大约 80 的情况下会返回 404 错误 我将有问题的代码归结为这个控制台应用程序 using System using System Net namespace W
  • 实施 Dijkstra 算法

    我的任务是 大学课程 实施某种形式的寻路 现在 在规范中 我可以实现强力 因为要搜索的节点数量有限制 开始 中间两个 结束 但我想重新使用此代码并来实现迪杰斯特拉算法 http en wikipedia org wiki Dijkstra