【问题标题】:Finding ALL shortest paths between two nodes in a graph having a multidimensional predecessor array在具有多维前驱数组的图中查找两个节点之间的所有最短路径
【发布时间】:2019-04-07 23:25:08
【问题描述】:

所以我一直在尝试寻找在未加权图中找到两个特定节点之间的所有最短路径的方法,并且我已经编写了代码,直到我建立了一个“前身”数组来跟踪我用来到达给定节点的节点。这个数组是一个多维数组,例如,如果从 A 到 D 的最短路径可以是 A > B > D OR A > C > D,那么前驱数组将如下所示(其中第一行是索引,并且那么下面的行是一个多维数组):

A    | B    | C    | D    | 
---------------------------
     | A    | A    | B    |
---------------------------
     |      |      | C    |

但是现在我不知道如何找到这个前身数组中的每个排列,以获得最短路径的所有可能组合,然后打印出来,例如我想打印出来:

All shortest paths:
A > B > D
A > C > D

我听说有人说你可以通过递归来做到这一点?但是我很迷茫。 (另外请注意,我不太担心时间复杂度)。感谢您的指导!

【问题讨论】:

标签: algorithm graph graph-algorithm breadth-first-search graph-traversal


【解决方案1】:

我听说有人说你可以通过递归来做到这一点?

我不确定他们说这话时的想法是什么,但我给你一个简单的方法来解决这个问题,它也会以良好的时间复杂度解决这个问题。使用 BFS 解决这种情况。 IMO,这是你最好的选择。

解决方案

Example graph:
(A,B,C,D,E)
A->B, A->C, B->D, B->E, C->E, D->E

Source: A, Destination: E
Paths: (marked with # are solution paths)
# A->B->E
# A->C->E
  A->B->D->E
  1. 从源节点开始。保持一个队列,每个元素有 3 个信息点:
    • 节点
    • 等级
    • 路径(到现在)
  2. 在图表上执行 BFS。在每个级别,检查是否到达目的地。继续此操作直到完成。
  3. 当您到达某个级别的目的地时,不要像往常一样停在那里。您需要完全完成此级别并在完成此级别时停止。
  4. 打印目的地的所有路径,这就是你的答案。

在我们的示例中进行此操作:

  • 队列的每个元素都表示为一个 3 值元组(节点、级别、路径)

初始队列:(A,0,null)

Level         Queue
 0            (A,0,null)
 1            (B,1,A)
 1            (C,1,A)
 2            (D,2,AB)
 2            (E,2,AB)      #       --> found destination, so, complete L2 fully
 2            (E,2,AC)      #
 3...stop

打印路径:上面的 ABE 和 ACE。

【讨论】:

  • 如何打印队列中的所有路径?您如何解释给出的示例中来自队列的路径?
  • @FallonX Path for current node = (Path from prev node + prev node),例如。你从 A 访问 B,path = null+'A' = A. eg2.你从 C 访问 E,路径 = 'A' + 'C' = AC
  • 是的,明白了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 2021-11-30
  • 1970-01-01
  • 2012-12-18
  • 2023-04-10
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
相关资源
最近更新 更多