加权图的 BFS 算法 - 寻找最短距离

2024-05-27

我看过很多帖子(即。post1 https://stackoverflow.com/questions/30409493/using-bfs-for-weighted-graphs, post2 https://cs.stackexchange.com/questions/18138/dijkstra-algorithm-vs-breadth-first-search-for-shortest-path-in-graph, post3 https://stackoverflow.com/questions/3818079/why-use-dijkstras-algorithm-if-breadth-first-search-bfs-can-do-the-same-thing)关于这个主题,但没有一篇文章提供了备份各自查询的算法。因此,我不确定是否接受这些帖子的答案。

在这里,我提出了一种基于 BFS 的最短路径(单源)算法,适用于非负加权图。谁能帮助我理解为什么 BFS(根据下面的基于 BFS 的算法)不用于此类问题(涉及加权图)!

算法:

SingleSourceShortestPath (G, w, s):
    //G is graph, w is weight function, s is source vertex
    //assume each vertex has 'col' (color), 'd' (distance), and 'p' (predecessor) 
        properties

    Initialize all vertext's color to WHITE, distance to INFINITY (or a large number
        larger than any edge's weight, and predecessor to NIL
    Q:= initialize an empty queue

    s.d=0
    s.col=GREY     //invariant, only GREY vertex goes inside the Q
    Q.enqueue(s)  //enqueue 's' to Q

    while Q is not empty
        u = Q.dequeue()   //dequeue in FIFO manner
        for each vertex v in adj[u]  //adj[u] provides adjacency list of u
             if v is WHITE or GREY       //candidate for distance update
                  if u.d + w(u,v) < v.d        //w(u,v) gives weight of the 
                                               //edge from u to v
                      v.d=u.d + w(u,v)
                      v.p=u
                      if v is WHITE
                          v.col=GREY    //invariant, only GREY in Q
                          Q.enqueue(v)
                      end-if
                  end-if
              end-if
         end-for
         u.col=BLACK  //invariant, don't update any field of BLACK vertex.
                      // i.e. 'd' field is sealed 
    end-while

Runtime:据我所知,它是 O(|V| + |E|) ,包括初始化成本

如果该算法与现有算法类似,请告诉我


由于伪代码是 Dijksta 的算法,使用 FIFO 队列而不是始终根据距离排序的优先级队列。每个访问过的(黑色)顶点计算出迄今为止可能的最短距离的关键不变量不一定是正确的。这就是为什么优先级队列是(正)加权图中距离计算所必需的原因。

您可以将算法用于未加权图,或者通过用权重替换每条边来使其不加权n with n-1由权重为 1 的边连接的顶点。

反例:

第一个之后的计算状态Q.enqueue(s):

第一次迭代后的计算状态:

该图作为反例的重要之处在于adj[u] = adj[S] = [F, M]并不是[M, F], hence F首先排队的是Q.enqueue(v)

第二次迭代后的计算状态:

由于顶点F首先出列的是u = Q.dequeue()(与使用距离优先队列时不同),本次迭代不会更新任何距离,F会变黑并且不变量会被违反。

最终迭代后的计算状态:

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

加权图的 BFS 算法 - 寻找最短距离 的相关文章

  • 求 Petersen 子图中的哈密顿路径

    我开始使用 IDE Jupyter Python 3 6 并出现了一个问题 我必须通过IDE绘制Petersen子图中的哈密顿路径 但我不知道该怎么做 我显示有关该图的信息 彼得森图 https en wikipedia org wiki
  • 识别鼠标移动的算法

    我想知道是否有任何研究 算法可以指定鼠标在识别 等字符时的偏差量使用鼠标绘制 某种光学字符识别 但可能是一个更简单的版本 是否有某种算法可以让我说用户绘制的问号确实是一个问号 而不是其他具有一定准确性的东西 就像 Windows 平板电脑软
  • StackOverflowError 计算 BigInteger 的阶乘?

    我正在尝试编写一个Java程序来计算大数的阶乘 它似乎BigInteger无法容纳这么大的数量 下面是我编写的 简单的 代码 public static BigInteger getFactorial BigInteger num if n
  • 对矩阵进行舍入,保留行和列总计

    想要 以保留行和列总计的方式对矩阵进行舍入的 伪 代码 问题从向量开始 X and Y of 非负整数 with Sum X Sum Y 想要圆X Y Sum X 同时保留行和列总计 这是婚姻问题的一种 Xa需要进行一定次数的握手 拨打该号
  • 数组中最远的相等元素

    假设你有一个未排序的数组 你如何找到两个相等的元素 使它们成为数组中最远的元素 例如8 7 3 4 7 5 3 9 3 7 9 0ans 将是7 9 7 1 8 我想到了以下几点 initialise max 0 using hashing
  • 用于计算三角函数、对数或类似函数的算法。仅限加减法

    我正在修复 Ascota 170 古董机械可编程计算机 它已经开始工作了 现在我正在寻找一种算法来展示其功能 例如计算三角或对数表 或类似的东西 不幸的是 从数学运算来看 计算机只能进行整数的加减法 从 1E12到1E12的55个寄存器 甚
  • 运行时间为 O(n) 且就地排序的排序算法

    有没有运行时间为O n 并且还分类到位 在某些情况下 最好的情况是 O n 但这可能是因为项目集合已经排序 你正在看 O nlogn 一些较好的平均值 话虽如此 排序算法的 Wiki 还是相当不错的 有一个表格比较了流行的算法 说明了它们的
  • 处理流星中的长服务器端计算

    我正在使用 jimp https www npmjs com package jimp https www npmjs com package jimp 在meteor JS中生成图像服务器端 换句话说 我正在使用递归算法 计算 图像的像素
  • 序列和与 GCD

    大约一个月前 我在编程挑战中遇到了这个问题 但社论尚未发布 所以我在这里问 有一个大小为 N 的数组 A 求 A 的 K 个长度子序列的总和 GCD Example 如果 A 1 2 3 且 K 2 1 2 3 总和 1 GCD 3 1 3
  • 一种良好且简单的随机性测量方法

    获取一长整数序列 例如 100 000 个 并返回序列随机性的测量值的最佳算法是什么 该函数应返回单个结果 如果序列并非完全随机 则返回 0 如果完全随机 则返回 1 如果序列有点随机 它可以给出介于两者之间的东西 例如0 95 可能是一个
  • 如何在 JavaScript 中构建树模式匹配算法?

    好吧 这是一个有点复杂的问题 但是 tl dr 基本上是如何使用 模式树 解析 实际树 如何检查特定的树实例是否与特定的模式树匹配 首先 我们有我们的结构模式树 模式树通常可以包含以下类型的节点 sequence节点 匹配一系列项目 零个或
  • 关于Marching Cubes算法的澄清

    关于Marching Cubes 我对其算法和实现有一些疑问 我已经阅读了 Marching Cubes 的 Paul Bourke 优秀文章以及网站上可用的源代码 但是 我在理解以及如何以自己的方式实现算法方面仍然遇到了一些问题 问题如下
  • 检查有效的 IMEI

    有人知道如何检查有效的 IMEI 吗 我找到了一个可以检查此页面的功能 http www dotnetfunda com articles article597 imeivalidator in vbnet aspx http www do
  • 定点数学比浮点运算快吗?

    多年前 即 20 世纪 90 年代初期 我构建了图形软件包 该软件包基于定点算术和预先计算的 cos sin 表格以及使用牛顿近似方法进行 sqrt 和对数近似的缩放方程来优化计算 这些先进技术似乎已经成为图形和内置数学处理器的一部分 大约
  • 如何将多边形放入另一个多边形内[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有两个多边形 如下图所示 左边是 粗多边形 右边是 最终多边形 现在 我正在寻找算法来将 最终多边形 拟合到 粗糙多边形 内 并具有
  • 什么是“朴素”算法,什么是“封闭式”解决方案?

    我有一些关于描述算法时使用的术语语义的问题 首先 朴素 算法是什么意思 这与给定问题的其他解决方案有何不同 解决方案还可以采取哪些其他形式 其次 我听到很多人提到 封闭式 解决方案 我也不知道这意味着什么 但在尝试解决递归关系时经常会出现
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 我如何能够以两行显示标题,并且每行的字体大小不同?

    我正在使用 Google Chart API 创建时间线图 并希望将图的标题修改为两行 问题 我如何能够显示具有不同字体大小的两线图表标题 电流输出 理想输出 相关研究 我唯一能找到的是有人试图用饼图来做到这一点 但我尝试了但无法使其发挥作
  • 使用什么算法来确定使系统达到“零”状态所需的最小操作数?

    这是一种更通用的问题 不是特定于语言的 有关要使用的想法和算法的更多信息 系统如下 它登记朋友群体之间的小额贷款 Alice and Bill要去吃午饭 比尔的卡坏了 所以爱丽丝支付了他的餐费 10 美元 第二天Bill and Charl

随机推荐

  • 用于交叉编译的`./configure`选项?

    据我所知 configure脚本是用 GNU 生成的Autoconf 我不知道Autoconf根本不 这些工具如何工作以及如何使用它 configure制作源代码以进行交叉编译的脚本 这是一篇关于如何交叉编译的非常好的小文章 http li
  • 如何将文件中的行读入数组?

    这就是我想做的 但有一句话 lines Array new File open test txt each line lines lt lt line 可能的 执行如下操作 File readlines test txt Read 文档 h
  • VS2005 中的 C#:设备项目可以同时针对完整框架和 CF 吗?

    我们正在 Visual Studio 2005 下使用 Compact Framework 为设备进行开发 但是 我们也希望制作该软件的模拟版本 在 PC 上运行 最好通过构建配置进行选择 然而 vsproj 文件似乎是特定于设备的 例如
  • 如何计算一组字符串的最短唯一前缀?

    这是一个非常常见的算法命令行解析 给定一组预定义的长选项名称 计算唯一标识这些选项之一的最短前缀 例如 对于以下选项 help hostname portnumber name polymorphic 这将是输出 he ho por n p
  • 隐藏 dc.js 图表 x 轴

    如下图所示 由于数据范围较大 x 轴非常混乱 我想删除 x 轴 幸运吗 我当前的代码 toneChart width 300 height 280 dimension tone group toneGroup title function
  • 如何使用 PHP 从文档中删除无效的 XML 字符

    我试图生成一个大约 23 到 30 MB 的 XML 文档 当我用 Firefox 打开它时 我收到 XML Parsing Error not well formed Location file Users User Downloads
  • 使用向量作为私有/公共成员的类设计?

    将容器类或其他类作为私有或公共成员放入类中的最佳方法是什么 要求 1 Vector 在我的班级中 2 需要向量相加和计数接口 如果容器的状态是类不变量的一部分 那么如果可能的话 它应该是私有的 例如 如果容器表示三维向量 则不变量的一部分可
  • 使用 pygithub3 for Python 获取存储库信息

    我正在尝试通过给定 Github 用户名来访问每个存储库中使用的语言 为了做到这一点 到目前为止我的Python代码是 from pygithub3 import Github username raw input Please enter
  • C# SqlDataReader 执行统计信息和信息

    我正在创建一个自动数据库查询执行队列 这本质上意味着我正在创建一个 SQL 查询队列 这些查询将被一一执行 使用类似于以下的代码执行查询 using SqlConnection cn new SqlConnection Configurat
  • 如何配置 JSON.mapping 将字符串数组的数组变成哈希?

    我正在尝试处理从 API 收到的以下 JSON product midprice prices APPLE 217 88 GOOGLE 1156 05 FACEBOOK 160 58 我可以获得基本的映射 require json mess
  • 最新的 Android NDK (r21c) 的 libbinder_ndk 缺少几个导出的 API

    我有兴趣使用AServiceManager get addService https cs android com android platform superproject android 10 0 0 r30 frameworks na
  • Gmail 启用两步验证时发送电子邮件失败

    我正在使用我的 Gmail 帐户并且smtp gmail com在我的网络应用程序中测试和发送电子邮件 当我的 Gmail 帐户启用两因素身份验证时 它无法发送电子邮件 但是当我将其关闭时 网络应用程序会成功发送电子邮件 感谢任何建议 在
  • 以 /* 开始初始注释的目的!在 JavaScript 和 CSS 文件中

    我注意到 JavaScript 或 CSS 文件中的初始注释有时以 感叹号的目的是什么 例如 jQuery https en wikipedia org wiki JQuery jQuery v1 7 1 jquery com jquery
  • Python/Django:我应该使用哪个authorize.net 库?

    我需要使用 Authorize net 集成来进行订阅付款 可能使用 CIM 要求很简单 每月定期付款 有几个不同的价格点 客户信用卡信息将存储在authorize net 中 周围有很多库和代码片段 我正在寻找关于哪些最有效的建议 Sat
  • 如何在不刷新的情况下向字段中插入数据?

    我需要知道如何在不刷新字段的情况下从数据库添加数据 我的意思是就像在电子邮件中添加联系人的工作一样 如果我单击 添加 按钮 我需要打开一个小窗口和其中的联系人 如果我检查一两个联系人并按插入键 它应该被插入到 收件人 字段中 而无需刷新父页
  • Hibernate 5 - createCriteria 已弃用

    我需要帮助来迁移代码createCriteria for Hibernate 5 代码如下 public Curso comDadosIguais Curso curso return Curso this session createCr
  • KSoap 请求超时?

    朋友们 我在 Soap 库中没有看到请求超时 有人指导我我应该做什么吗 或者从哪里下载最新版本 my code SoapObject userRequest new SoapObject NAMESPACE METHOD NAME user
  • 连接到 mysql 服务器(localhost)非常慢

    实际上有点复杂 摘要 与数据库的连接非常慢 页面渲染大约需要 10 秒 但页面上的最后一条语句是一个回显 当页面在 Firefox 中加载时我可以看到它的输出 IE 是相同的 在谷歌浏览器中 只有在加载完成后输出才可见 不同浏览器的加载时间
  • 使用频道 ID 在 Telethon 中抓取 Telegram 消息

    我正在尝试从我所属的 Telegram 频道中抓取新消息 我有 ID 和邀请链接 但没有实际地址 下面的代码与我用来测试的路透社频道配合得很好 是否可以使用 ID 或邀请链接代替实际地址 import configparser import
  • 加权图的 BFS 算法 - 寻找最短距离

    我看过很多帖子 即 post1 https stackoverflow com questions 30409493 using bfs for weighted graphs post2 https cs stackexchange co