在具有多维前驱数组的图形中找到两个节点之间的所有最短路径

时间:2019-04-07 23:25:09

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

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

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

但是现在我迷失了如何找到此前代数组中的每个排列,以获取最短路径的所有可能组合,然后打印出来,例如我想打印出来:

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

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

1 个答案:

答案 0 :(得分:0)

  

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

我不确定他们在说这句话时会想到什么,但是我给您提供了一种解决此问题的简单方法,它也将以很好的时间复杂性解决该问题。使用BFS解决这种情况。海事组织,这是你最好的选择。

解决方案

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。