使用 BFS 进行加权图

2024-03-17

我正在修改单源最短路径算法,在视频中,老师提到BFS/DFS不能直接用于查找最短路径 in a 加权图(我想每个人都知道这一点)并说自己找出原因。

我想知道为什么它不能用于加权图的确切原因/解释。是由于边缘的重量还是其他原因造成的?有人可以解释一下我吗,因为我感到有点困惑。

PS:我经历过this https://stackoverflow.com/questions/8379785/how-does-a-breadth-first-search-work-when-looking-for-shortest-path-java问题和this https://cs.stackexchange.com/questions/18138/dijktra-algorithm-vs-breath-first-search-for-shortest-path-in-graph问题。


考虑这样的图表:

A---(3)-----B
|           |
\-(1)-C--(1)/

从 A 到 B 的最短路径是经过 C(总权重为 2)。普通的 BFS 将直接采用从 A 到 B 的路径,将 B 标记为“可见”,以及从 A 到 C,将 C 标记为“可见”。

在下一阶段,从C传播,B已经被标记为可见,所以从C到B的路径不会被认为是潜在的更短路径,BFS会告诉你从A到B的最短路径有一个权重共 3 个。

您可以使用迪杰斯特拉算法 http://en.wikipedia.org/wiki/Dijkstra's_algorithm而不是 BFS 来寻找加权图上的最短路径。从功能上来说,该算法与BFS非常相似,并且可以用与BFS类似的方式编写。唯一改变的是您考虑节点的顺序。

例如,在上图中,从 A 开始,BFS 将处理 A --> B,然后 A --> C,并在那里停止,因为所有节点都已被看到。

另一方面,Dijkstra 算法的运行过程如下:

  1. 考虑 A --> C(因为这是 A 中的最低边权重)
  2. 考虑 C --> B (因为这是我们迄今为止到达的任何节点的最低权重边,我们尚未考虑)
  3. 考虑并忽略 A --> B,因为 B 已经被看到。

请注意,区别仅在于order其中检查边缘。 BFS 会考虑all在移动到其他节点之前从单个节点删除边,而 Dijkstra 算法将始终考虑重量最低的unseen边,来自连接到的边集到目前为止见过的所有节点

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

使用 BFS 进行加权图 的相关文章

  • 用于检索编辑距离接近的字符串的数据结构

    例如 从一组英语单词开始 是否有一种结构 算法允许使用单词 right 作为查询来快速检索诸如 light 和 tight 之类的字符串 即 我想检索与查询字符串编辑距离较小的字符串 The BK tree http blog notdot
  • 如何在matplotlib_venn中将维恩图保存为PNG图

    使用以下代码我尝试创建维恩图 然后另存为文件 import matplotlib from matplotlib venn import venn2 set1 set A B C D set2 set B C D E plt venn2 s
  • 如何在 O(n) 时间内遍历二叉树而不需要额外的内存

    给定一棵带有整数 左指针和右指针的二叉树 如何在 O n 时间和 O 1 额外内存 无堆栈 队列 递归 内遍历该树 This guy http nandacumar blogspot com 2006 06 traversing tree
  • 在 Haskell 中阅读 GraphML

    我正在尝试将包含单个有向图的 GraphML 文件读入 HaskellData Graph http hackage haskell org package containers 0 2 0 1 docs Data Graph html为了
  • 计算标签云中标签字体大小的公式是什么?

    我有一个标签云 我需要知道如何更改最常用标签的字体大小 我需要设置最小字体大小和最大字体大小 您可以使用线性或对数评估与某个标签相对于最大标签关联的项目数量 将其乘以最小和最大字体大小之间的差值 然后将其添加到最小字体大小 例如 伪代码中的
  • 将区间映射到更小的区间的算法

    我尝试搜索 但由于问题的性质 我无法找到满意的内容 我的问题如下 我试图将 0 到 2000 范围内的数字 尽管理想情况下上限是可调的 映射到 10 到 100 范围内的更小的区间 上限将映射 2000 gt 100 和下限也是如此 除此之
  • 比较周期性数据的快速方法

    假设我有任意类型的数据集 A B C D 并且我想将其与另一个数据集进行比较 我希望 A B C D B C D A C D A B 和 D A B C 的比较成立 但是不适用于 A C B D 或任何其他未类似排序的集合 有什么快速方法可
  • 生成非连续组合

    我正在尝试创建一个生成器 支持执行 next 的迭代器 可能在 python 中使用yield 它给出来自 1 2 n n 和 r 是参数 的 r 元素的所有组合 这样在选出的r个元素 没有两个是连续的 例如 对于 r 2 且 n 4 生成
  • 这个洗牌算法有什么问题吗?

    我一直在做一些休闲假期计算 我的迷你项目是模拟意大利游戏 tomboli 一个关键的组成部分是对以下过程的模拟 游戏由一名男子控制 他拿着一袋 90 个弹珠 编号为 1 到 90 他从袋中随机取出一颗弹珠 每次向玩家喊出弹珠编号 经过一番思
  • 图表贡献者为空

    我在 github 上有几个项目 但其中一些项目的贡献者图是空的 即使我的 gitconfig 设置了名称和电子邮件 https github com jlengrand batchWaterMarking graphs contribut
  • 如何最小化两个子多边形的最大纵横比?

    我想使用直线将凸多边形切成给定面积比的两部分 以使两个子多边形的较大纵横比最小化 目前我的方法包括选择一个随机起点 计算将多边形分割成目标区域的适当终点 然后计算两个纵横比中较大的一个 然后重复这个很多次 直到我足够接近最小值 多边形 A
  • 修改排列算法以防止重复打印输出的策略

    我一直在审查实践算法 目前正在研究一种我非常喜欢的排列算法 void permute char set int begin int end int range end begin if range 1 cout lt lt set lt l
  • 获取无平方数的列表

    获得该值的一种方法是自然数 1 n 我们对每个因子进行因式分解 看看它们是否有重复的质因数 但这对于大的情况来说会花费很多时间n 那么有没有更好的方法从 1 中获取无平方数n 您可以使用埃拉托斯特尼筛法的修改版本 取一个布尔数组 1 n 预
  • 如何找到最长的回文子序列(不是它的长度)

    我想找出字符串中最长的回文子序列 我到处都找到了找出子序列长度的算法 并声明该算法也可以扩展以返回子序列 但我没有找到如何实现的 有人能解释一下我怎样才能得到序列吗 既然你提到了链接最长回文子序列 http www geeksforgeek
  • Java:使用indexOf方法根据另一个数组对数组进行排序

    我想根据另一个数组 索引 的排序顺序迭代两个数组 A B 在本例中为 10 34 32 21 String A a b c d String B e f g h int indexes 10 34 32 21 为这里的坏例子道歉 我已经更新
  • 给定两个(大)点集,我如何有效地找到彼此最接近的点对?

    我需要解决一个计算问题 该问题归结为搜索两个集合之间最接近的点对 问题是这样的 给定欧几里德空间中的一组点 A 和一组点 B 找到所有对 a b 使得 b 是 B 中与 a 最近的点 a 是 A 中与 b 最近的点 集合 A 和 B 的大小
  • 检查数独字段的很酷的算法?

    有谁知道一个简单的算法来检查数独配置是否有效 我想出的最简单的算法是 对于大小为 n 的板 伪代码 for each row for each number k in 1 n if k is not in the row using ano
  • 如何在 dijkstra 算法中以 O(log n ) 时间更新优先级队列中的键?

    过去一周我一直在研究 dijkstra 算法 我在 java 中有正确的运行代码 它使用数组来计算标准 findMin 函数 该函数为您提供距离最小的顶点 显然它是 O n 现在我希望使用优先级队列 最小堆 来实现它 我的思考过程是 whi
  • 如何使用KDTrees实现最近邻搜索?

    所以 我正在实施一个KD Tree http en wikipedia org wiki Kd tree进行最近邻搜索 我已经构建了树部分 但我认为我没有完全理解搜索部分 关于遍历树来搜索邻居 维基百科文章如下 Starting with
  • 交换两个向量之间的值,使两个向量的 max_element 之和最小

    这是 Codechef 的问题 但请耐心等待 https www codechef com ZCOPRAC problems ZCO16001 https www codechef com ZCOPRAC problems ZCO16001

随机推荐

  • 在选择器列表中使用 @at-root 和 &

    我有一个 CSS 我尝试将其迁移到 SASS 其中包含许多结构 例如 btn primary hover btn primary focus btn primary active btn primary active open dropdo
  • 如何在executeBatch()之前检查Prepared Statement是否有批次?

    我对Java中的Prepared Statement有疑问 因为我对此了解不多 我有一个必须使用PreparedStatement 的用例 但我在编写代码之前只是想 while if preparedStatement setString
  • 如何标记 Perl 源代码?

    我有一些合理的 未混淆的 Perl 源文件 我需要一个标记生成器 它将其分割为标记 并返回每个标记的标记类型 例如对于脚本 print Hello World n 它会返回这样的内容 关键字5字节 空白 1 字节 双引号字符串 17 字节
  • 集成测试中的 MVC 策略覆盖

    我正在为 MVC 应用程序添加集成测试 我们的许多端点都应用了策略 例如 namespace WorkProject Route A Route public class WorkController Controller HttpPost
  • 根据另一个 DataFrame 选择一个 DataFrame 的列

    我试图根据另一个 DataFrame 的列选择 DataFrame 的子集 数据框看起来像这样 a b c d 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11 3 12 13 14 15 a b 0 0 1 1 2 3 2
  • 在 Android 上同时与多个 BLE 设备进行稳健通信

    尽管没有记录 但使用 Android BLE api 的传统观点是 某些操作 例如读 写特性和描述符 应该一次完成一个 尽管某些设备比其他设备更宽松 但是 我不清楚此策略是否应仅适用于单个连接 还是适用于所有活动连接 我听说最好一次启动与一
  • Cython 和 Python 项目测试驱动开发和 .pyx 文件结构建议

    构建一个的最佳方式是什么python cython项目 以便我可以对驻留在其中的代码进行单元测试 pyx文件 是否可以就地对该代码进行单元测试 或者重构可以让我以另一种方式实现这一目标 我是新来的cython但有 Python TDD mo
  • EnableAutoConfiguration spring 注解如何工作?

    I am no fan of gross over abstractions And i think Spring has committed a major felony 但如果有人可以解释 自动 配置背后的算法 我这次愿意忽略它 看看s
  • 检查Python中每行的运行时间

    我已经编写了一个 Python 脚本 但运行它所花费的时间比我预期的要长得多 并且我在脚本中没有明显的候选行占用运行时间 我可以在代码中添加任何内容来检查运行每一行需要多长时间吗 非常感谢 您尝试过通过分析运行 python 吗 pytho
  • 无法在 M1 Macbook 上启动 Cloud Run 容器

    我还没有在我的 M1 Macbook 上安装 Rosetta 安装了 Docker 和所有 deps 这甚至工作了几次 但不确定是什么突然导致了这个错误 Starting to run the app using configuration
  • 反应原生动画:滚动减慢时屏幕抖动

    我在用Animated View更改标题高度 它在 ios 中运行良好 但在 android 中 当我缓慢滚动时 整个视图都在晃动 1 首先我设置状态 this state scrollY new Animated Value 0 2 内部
  • 无需用户交互即可从服务器驱动 API 文档上传

    我正在 Django 中制作应用程序 该应用程序从表单上传文件并将其发送到谷歌驱动器 所以基本上我不知道需要用户的信息或让他们在谷歌上进行身份验证 从我们使用的快速入门指南authorize url to get code但我不需要oaut
  • 用 Java 洗牌

    我还有另一项练习要做 我确实需要帮助 我什至不知道我的 isFlush 方法是否有效 因为出于某种原因 我的套牌没有洗牌和发牌 我完全陷入困境 有人可以帮助我或指出我正确的方向或其他什么吗 这是练习 练习 12 5 本练习的目标是编写一个程
  • Express 中使用 cookie 会话保持登录选项

    我想要一个 保持登录状态 选项 例如 Gmail 提供的选项 这样 用户可以决定如果他们想在之前关闭浏览器会话后打开新的浏览器会话时保持会话打开 查看我看到的 github 问题cookie session 组件不提供更新的方法maxAge
  • 需要asp.net中的作业调度程序

    我们有一个网站 需要一个调度程序来在特定时间接收通知 电子邮件 例如 如果有人在下午 5 点设置提醒参加下午 4 45 的会议 则大约会在下午 4 45 收到电子邮件 由于此站点托管在共享服务器上 因此我们无法控制服务器来运行任何 SQL
  • 将 pdf 直接发送到打印机对话框的链接

    我尝试过以下2种方法 a class print a a Print file a 又一次尝试
  • Python 中的机械化 - 提交后重定向不起作用

    我刚刚开始在 Python 中使用 mechanize 但已经遇到了一些问题 我在 StackOverflow 和 Google 上查看过 我看到人们说文档很棒 并且应该很容易让它工作 但我想我不知道如何查找该文档 因为我所有的可以找到的代
  • [NSObject:任何对象]?' Xcode 6 beta 6 中没有名为“下标”的成员错误

    我使用下面的几行代码来获取键盘在屏幕上显示时的框架 我已经注册到UIKeyboardDidShowNotification通知 func keyboardWasShown notification NSNotification var in
  • 远程 RPC 客户端已解除关联。可能是由于容器超过阈值或网络问题。检查驱动程序日志中是否有 WARN 消息

    我正在开发 5 节点集群 每个节点 7 个核心 每个节点 25 GB 我当前的执行使用 1 2GB 输入数据 我能知道为什么会出现以下错误吗 我使用 pyspark 数据框 spark 1 6 2 Stage 9487 gt 198 2 2
  • 使用 BFS 进行加权图

    我正在修改单源最短路径算法 在视频中 老师提到BFS DFS不能直接用于查找最短路径 in a 加权图 我想每个人都知道这一点 并说自己找出原因 我想知道为什么它不能用于加权图的确切原因 解释 是由于边缘的重量还是其他原因造成的 有人可以解