查找未加权无向图中两个节点之间的所有最短路径

2023-12-02

我需要帮助找到一个节点中两个节点之间的所有最短路径未加权无向图.

我能够使用 BFS 找到最短路径之一,但到目前为止我不知道如何找到并打印所有路径。

对我可以使用的算法/伪代码有什么想法吗?


需要注意的是,请记住,图中两个节点之间的最短路径可能呈指数级增长。任何算法都可能需要指数时间。

也就是说,有一些相对简单的算法可以找到所有路径。这是两个。

BFS+反向DFS

在图上运行广度优先搜索时,您可以用距起始节点的距离来标记每个节点。起始节点的距离为0,然后,每当第一次发现新节点时,它的距离就是发现它的节点的距离加一。因此,首先在图上运行 BFS,记下到每个节点的距离。

一旦你有了这个,你就可以找到a从源到目的地的最短路径如下。从目的地开始,该目的地距起始节点一定距离 d。现在,查看具有进入目标节点的边的所有节点。从源到目的地的最短路径必须沿着从距离 d-1 的节点到距离 d 的目的地的边结束。因此,从目标节点开始,向后穿过某条边到达距离 d-1 处的任何节点。从那里,步行到距离 d-2 处的节点,距离 d-3 处的节点,依此类推,直到回到距离 0 处的起始节点。

此过程将以相反的顺序为您提供一条返回路径,您可以在最后翻转它以获得整体路径。

然后你可以找到all通过从结束节点回到起始节点运行深度优先搜索,从源到目的地的路径,在每个点尝试所有可能的方法从当前节点向后走到距离正好小于 1 的前一个节点当前节点的距离。

(我个人认为这是找到所有可能路径的最简单、最干净的方法,但这只是我的意见。)

多个父母的 BFS

下一个算法是对 BFS 的修改,您可以将其用作预处理步骤,以加速所有可能路径的生成。请记住,当 BFS 运行时,它会按“层”向外进行,获得一条到距离 0 处的所有节点的最短路径,然后是距离 1,然后是距离 2,等等。BFS 背后的动机是,距离 k + 1 处的任何节点从起始节点开始必须通过一条边连接到距起始节点距离为 k 的某个节点。 BFS 通过找到到距离 k 处的节点的长度为 k 的路径,然后通过某个边对其进行扩展,来发现距离为 k + 1 处的该节点。

如果你的目标是找到all最短路径,那么你可以通过扩展来修改BFSevery到距离为 k 的节点到它们连接到的距离为 k + 1 的所有节点的路径,而不是选择单个边。为此,请按以下方式修改 BFS:每当通过在处理队列中添加端点来处理边时,不要立即将该节点标记为已完成。相反,将该节点插入到队列中,并标明您遵循哪条边到达该节点。如果有多个节点链接到该节点,这可能会让您将同一节点多次插入队列中。当您从队列中删除一个节点时,您将其标记为已完成,并且永远不会再次将其插入队列中。同样,您将存储多个父指针,而不是存储单个父指针,每个父指针对应链接到该节点的每个节点。

如果您执行此修改后的 BFS,您最终将得到一个 DAG,其中每个节点要么是起始节点并且没有传出边,要么距离起始节点为 k + 1,并且将有一个指向每个节点的指针它所连接的距离k。从那里,您可以通过列出从您选择的节点回到 DAG 中的起始节点的所有可能路径来重建从某个节点到起始节点的所有最短路径。这可以递归地完成:

  • 从起始节点到自身只有一条路径,即空路径。
  • 对于任何其他节点,可以通过跟踪每个传出边缘来找到路径,然后递归地扩展这些路径以产生返回到起始节点的路径。

这种方法比上面列出的方法需要更多的时间和空间,因为通过这种方式找到的许多路径不会朝着目标节点的方向移动。不过,它只需要对BFS进行修改,而不是BFS后面再进行反向搜索。

希望这可以帮助!

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

查找未加权无向图中两个节点之间的所有最短路径 的相关文章

  • 找到一系列间隔的最有效分组

    我有一个应用程序 其中有一系列不重叠的固定宽度间隔 每个间隔都有一个给定的键 每个间隔具有相同的宽度 并且可以存在连续的间隔 本质上 我想以最小化单独间隔的数量的方式对间隔和键进行分组 这可以通过合并具有相同键的连续间隔或查找匹配间隔并将它
  • 如何求小于给定数的最大2次方

    我需要找到小于给定数字的最大 2 次幂 我陷入困境 找不到任何解决方案 Code public class MathPow public int largestPowerOf2 int n int res 2 while res lt n
  • 有人可以解释以下异或属性

    我的一个论坛提到给定的数组n数字 arr 0 n 1 以下条件成立 is the xor运算符 f l r f 0 r f 0 l 1 where f l r arr l arr l 1 arr r 我检查了上面的数组数量和不同的值l an
  • 寻找将集合映射到整数的双射函数

    对于任意两个序列 a b 其中 a a1 a2 an 且 b b1 b2 bn 0a b具有相同的元素 而不关心它们的顺序 例如 如果 a 1 1 2 3 b 2 1 3 1 c 3 2 1 3 则 f a f b f a f b 我知道有
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • URL路径相似度/字符串相似度算法

    我的问题是我需要比较 URL 路径并推断它们是否相似 下面我提供了要处理的示例数据 GROUP 1 robots txt GROUP 2 bot html GROUP 3 phpMyAdmin 2 5 6 rc1 scripts setup
  • 生成所有多集大小为 n 的分区的算法

    我一直在试图找出一种方法来生成多重集的所有不同的大小为 n 的分区 但到目前为止却空手而归 首先让我展示一下我想要实现的目标 假设我们有一个输入向量uint32 t std vector
  • 快速约会算法

    我在一家咨询公司工作 大部分时间都在客户所在地 正因为如此 我很少见到同事 为了更好地了解彼此 我们将安排一个晚宴 会有很多小桌子 方便人们聊天 为了在聚会期间与尽可能多的不同的人交谈 每个人都必须每隔一段时间 比如每小时 换一张桌子 如何
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • 在常数空间中创建 1..N 的随机排列

    我正在寻找枚举固定空间中数字 1 N 的随机排列 这意味着我无法将所有数字存储在列表中 原因是 N 可能非常大 超过可用内存 我仍然希望能够一次遍历这样一个数字的排列 只访问每个数字一次 我知道对于某些 N 可以这样做 许多随机数生成器随机
  • 直接选择排序与交换选择排序

    有什么区别直接选择排序 vs 交换选择排序 今天我陷入了一场争论 我的教授在他的讲义中使用了这两个术语 维基百科和任何教科书或网站都会为您提供的选择排序就是他所说的 交换选择排序 我以前从未听说过 交换选择排序 这个术语 仅 选择排序 并且
  • 如何检查是否存在可能的路径?

    我正在开发一个基于 javascript 的实验性游戏 玩家必须在二维平铺地图上移动才能退出 请随意检查这个小提琴并演奏 http jsfiddle net moonlife 74vLd 我只是随机放置障碍物 但有时障碍物会挡住玩家和出口之
  • 找到一条穿过任意节点序列的最短路径?

    In 这个先前的问题 https stackoverflow com questions 7314333 find shortest path from vertex u to v passing through a vertex wOP询
  • 具有 2 个属性的背包算法。如何在 3d 数组中实现它?

    当有超过 1 个属性时 我无法理解背包问题 当有 1 个属性时 我必须编写一个使用具有 2 个属性的背包算法的程序 老师告诉我们 它必须在 3d 数组中完成 错误的实现将导致 O 2 n 处理时间 我无法想象这样的数组会是什么样子 假设这是
  • 从一种数字系统转换为另一种数字系统后会有多少位数字

    主要问题 有多少位数字 让我解释 我有一个二进制数 11000000 十进制数是192 转换为十进制后 它有多少位 以十进制表示 在我的示例中 它是 3 位数字 但是 这不是问题 我在互联网上搜索并找到了一种用于整数部分的算法和一种用于小数
  • 在 O(n) 时间内排序?

    我被这个问题困扰了 2周 知道如何处理它吗 令 L 为 n 个不同整数的列表 假设 L 的 x 的元素在 1 750 范围内 设计线性排序算法对 L 的元素进行排序 我已经尝试过插入排序 但我不确定我的方法是否正确 Construct an
  • 数据聚合和缓存:如何按时间间隔快速绘制大型时间序列数据集的图表

    我有一个巨大的时间序列数据集 我想绘制图表 时间序列可以追溯到 5 年前 从后端的角度来看 以各种分辨率 间隔 显示这些数据的常用方法是什么 本质上我想绘制这样的数据图表 https bitcoinwisdom com markets bi
  • 实施二分查找有哪些陷阱? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 二分查找比看起来更难实现 虽然二分搜索的基本思想相对简单 但细节可能出人意料地棘手 Donald Knuth 新的二分搜索实现中最有可
  • 每个术语出现的次数

    我得到了一个数组a n 2 where n can be 10 5最大时有n个科目和n个学生 全部编号为 1 2 n a i 0 and a i 1 1 lt i lt n 表示在第 i 个科目中 所有来自a i 0 to a i 1 通过
  • 需要解释搜索最小大和的算法

    我正在解决 Codility 问题作为练习 但无法回答其中一个问题 我在互联网上找到了答案 但我不明白这个算法是如何工作的 有人可以引导我逐步完成它吗 这是问题 You are given integers K M and a non em

随机推荐

  • 如何修复 int.Parse 中的 ArgumentNullException?

    这是在 Mono 中运行良好的 cs 文件 using System public class HelloWorld static public void Main Console WriteLine Enter a number int
  • 函数“sleep()”的正确 #include 是什么?

    我正在使用 Big Nerd Ranch 的书 Objective C 编程 它首先让我们在前几章中用 C 编写 在我创建的一个程序中 我使用了睡眠功能 书上告诉我要放 include
  • SockJs - 未找到“信息”路径

    我正在运行一个SockJS 的示例 运行 npm install 一切正常 Start server没有问题 当我第一次加载时测试页 我看到 404 调用失败http 127 0 0 1 echo info 我正在查看 sockjs 代码
  • 如何调用Android联系人列表?

    我正在制作一个 Android 应用程序 需要调用手机的联系人列表 我需要调用联系人列表功能 选择一个联系人 然后返回我的应用程序并显示该联系人的姓名 这是我在互联网上获得的代码 但它不起作用 import android app List
  • Windows Phone 8.1 中的 AutoSuggestBox 出现奇怪的结果

    我正在尝试使用标准AutoSuggestBox在 Windows Phone 8 1 XAML 应用程序中 但它的行为非常奇怪 在一个简单的演示中 我收集了 Items new ObservableCollection
  • Android - 加快在数据库中插入数据的速度

    我目前有一个 CSV 文件 我正在解析该文件 并尝试将数据插入到 android 数据库中 我遇到的问题是插入所有数据花费的时间太长 数据量很大 但我觉得不需要 20 分钟左右就能完成 基本上 我创建数据库 然后开始解析 在解析每个单独的
  • CameraSource .setAutoFocusEnabled(true) 返回:尽管设备支持自动对焦,但该设备不支持相机自动对焦

    下面是我的条形码扫描仪活动 除了 setAutoFocusEnabled true 之外 一切正常 它在运行时返回一条消息 显示我的设备不支持自动对焦 尽管 Samsung Tab E T561 是支持自动对焦的设备 import andr
  • 如何使用 R 和 ggplot 绘制逻辑回归模型的结果

    creat a new data frame and add a binary column called surv24 leukemia data lt data frame wbc leuk wbc ag leuk ag time le
  • 减小 pdf 大小 - Objective c

    我有一个pdf生成项目 它由一些文本和一个已存储在数据库中的图像组成 我想预览并邮寄生成的pdf 当只有文本数据时一切正常 如果我们的数据中有图像 就会出现问题 邮件收到 大小为 10MB 或以上的 pdf 即使它具有大小为 1MB 或以下
  • List RemoveAll() 没有删除项目

    我有一个看起来像这样的对象 Text Another lovely alert Category 2 UserAlerts UserId 2 这将传递到 Web API 并正确绑定到 Key Column Order 0 public lo
  • SwiftUI @FetchRequest 使应用程序崩溃并返回错误

    我正在尝试使用 Xcode 11 在 SwiftUI 的 mac 应用程序中使用核心数据 我在创建项目时勾选了 使用核心数据 我还创建了实体 称为 VisitedCases 并使用编辑器创建 NSManagedObject 子类文件 我还将
  • F#:从另一个列表中过滤一个列表中找到的项目

    假设我有两个列表 let a 1 1000 let b 250 500 如何获取包含值 1 249 501 1000 的新列表 由于您的列表已排序 因此您可以使用此 非尾递归 函数在线性时间内解决此问题 let rec except a b
  • Specs2 - 标记要运行的测试

    我已经使用 ScalaTest 一段时间了 我发现标记测试并从命令行仅运行具有特定标记的测试的功能非常有用 Specs2中有类似的东西吗 我知道您可以使用 testOnly 运行特定的测试类 但我只想使用规范中的特定标签运行测试 操作方法如
  • 如何在 CSS 中使用 :not 选择器?

    我的问题说明了一切 我是 CSS 新手 我正在尝试使用以下代码 但它不起作用 ul verticalNav declaration ul verticalNav li declaration ul verticalNav li a decl
  • AppCompat PreferenceActivity 向上按钮不起作用

    我正在尝试创建一个扩展 AppCompatPreferenceActivity 并在操作栏中实现向上按钮的活动 视觉上一切看起来都很好 但向上按钮不响应触摸事件 以下是我的java和xml代码 PrefrencesDisplayActivi
  • aChartEngine、GraphicalView OnClickListener 不起作用

    我是 android 新手 正在使用 aChartEngine 创建条形图 我想在用户单击图表时捕获 x 和 y 值 我已经查看了 aChartEngine 的演示 并且我的图表创建得很好 但是 当我单击图形时 onClickListner
  • 当 eventDrop 被调用时,如何发送 ajax 请求来更新 FullCalendar UI 中的事件?

    我正在尝试使用这个很棒的用户界面 全日历 但我想做的是 当用户移动事件时 发送一个 ajax 请求来更新数据库中的事件数据 因此 如果用户想要将事件移至日历中的不同日期 那么我需要能够使用 ajax 请求将请求发送到数据库 我如何收集新信息
  • 用户输入创建对象

    我正在尝试创建一个使用用户输入的新对象 我尝试将用户输入分配给变量但是不知道如何添加变量当我声明新对象时到新对象 这只是我需要帮助的代码部分 我需要帮助的部分是line 8 我知道我可以随机放置一些东西 当我使用我的设置方法时 它会覆盖 但
  • 从 Amazon MySQL RDS 本地导入转储时 MySQL 语法错误?

    当我从 Amazon RDS 创建数据库转储然后尝试将其导入本地时 结果是ERROR 1064 42000 at line 54 第 54 行有如下语句 CREATE TABLE account emailconfirmation 用于转储
  • 查找未加权无向图中两个节点之间的所有最短路径

    我需要帮助找到一个节点中两个节点之间的所有最短路径未加权无向图 我能够使用 BFS 找到最短路径之一 但到目前为止我不知道如何找到并打印所有路径 对我可以使用的算法 伪代码有什么想法吗 需要注意的是 请记住 图中两个节点之间的最短路径可能呈