【问题标题】:How do you find the shortest path quickly in a breadth first search?如何在广度优先搜索中快速找到最短路径?
【发布时间】:2013-02-06 23:48:49
【问题描述】:

我正在使用广度优先搜索来查找图表中的位置,并且我很确定我的算法可以正常工作,但是当我完成后,我很难找到通往结果的最短路径。本质上,我可以使用 BFS 从我的起始位置到我的结束位置,但我不知道如何构建从结束到开始的最短路径。任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 找到两点之间的最短路径实际上包括找到这些点的问题,所以你已经有一个工作的 BFS 让你离最短路径问题更近了一步。对于最短路径算法,您有很多选择 - A*、Dijkstra、Bellman-Ford 仅举几例 - 所以请查看它们。
  • 我认为 OP 假设该图未加权。
  • @Bob John,您需要指定图表是否加权和/或定向。如果两者都不是,那么回溯 BFS 将为您提供解决方案。请注意,可能有多个最短路径(长度相等)。

标签: c++ algorithm graph breadth-first-search


【解决方案1】:

一个选项如下。创建某种将每个节点与“父”节点相关联的方法(可能是哈希表,或者可能通过将“父”字段添加到代表节点的任何类型)。然后,每当您从队列中取出一个节点 u 并准备将一个节点 v 添加到队列中时,将 v 的父指针设置为节点 u。这标志着你到达节点 v 的方式是沿着到达 u 的路径,然后将路径延长一条边到达 v。

完成此操作并完成 BFS 后,您可以通过从目标节点开始读取最短路径的反向,然后重复跟随父指针直到返回开始节点。一旦你有了这个,你就可以反转这条路径来取回实际的最短路径。

希望这会有所帮助!

【讨论】:

  • 这假设最短路径是从初始 BFS 向后追溯,这在一般情况下绝对不正确。
  • @CongXu- 绝对。我假设由于 OP 首先使用 BFS,因此该图未加权,在这种情况下,BFS 确实找到了从源节点到每个目标节点的最短路径。在加权图中,您肯定会使用另一种算法(Dijkstra、Bellman-Ford 等)
  • +1 出色的答案。是否可以使用null 标记未访问的节点,并使用指向父节点的指针标记已访问的节点(您必须在 BFS 中标记节点,对吗?伙计,我生疏了)。
  • @Patrick87- 是的,这绝对有效。事实上,这可能是实现 BFS 的最简单方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多