Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在具有多维前置数组的图中查找两个节点之间的所有最短路径_Algorithm_Graph_Graph Algorithm_Breadth First Search_Graph Traversal - Fatal编程技术网

Algorithm 在具有多维前置数组的图中查找两个节点之间的所有最短路径

Algorithm 在具有多维前置数组的图中查找两个节点之间的所有最短路径,algorithm,graph,graph-algorithm,breadth-first-search,graph-traversal,Algorithm,Graph,Graph Algorithm,Breadth First Search,Graph Traversal,因此,我一直在尝试寻找在未加权图中两个特定节点之间找到所有最短路径的方法,并且我编写了代码,直到我建立了一个“前置”数组,它跟踪我用来到达给定节点的节点。此数组是多维数组,因此,例如,如果从a到D的最短路径可以是a>B>D或a>C>D,则前置数组将如下所示(其中第一行是索引,下面的行是多维数组): 但现在我不知道如何在这个前置数组中找到每个排列,以获得每个可能的最短路径组合,然后打印出来,例如,我想打印出来: All shortest paths: A > B > D A >

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

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

All shortest paths:
A > B > D
A > C > D
我听人说你可以通过递归来实现这一点?但是我很迷路。(同时请注意,我并不太担心时间的复杂性)。谢谢您的指导

我听人说你可以通过递归来实现这一点

我不确定他们在说这句话的时候有什么想法,但我给你们一个简单的方法来解决这个问题,它也会以很好的时间复杂性来解决这个问题。使用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
  • 从源节点开始。保持队列,每个元素有3个信息点:
    • 节点
    • 水平仪
    • 小路(至今)
  • 在图表上做一个BFS。在每一级,检查是否到达目的地。继续此操作直到完成
  • 当你到达目的地的某个高度时,不要像通常情况下那样停在那里。您需要完全完成此级别,并在完成此级别后停止
  • 打印目标的所有路径,这将是您的答案
  • 在我们的示例中执行此操作:

    • 队列的每个元素都表示为一个3值元组(节点、级别、路径)
    初始队列:(A,0,null)

    打印路径:ABE和ACE从上方开始

    我听人说你可以通过递归来实现这一点

    我不确定他们在说这句话的时候有什么想法,但我给你们一个简单的方法来解决这个问题,它也会以很好的时间复杂性来解决这个问题。使用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
    
  • 从源节点开始。保持队列,每个元素有3个信息点:
    • 节点
    • 水平仪
    • 小路(至今)
  • 在图表上做一个BFS。在每一级,检查是否到达目的地。继续此操作直到完成
  • 当你到达目的地的某个高度时,不要像通常情况下那样停在那里。您需要完全完成此级别,并在完成此级别后停止
  • 打印目标的所有路径,这将是您的答案
  • 在我们的示例中执行此操作:

    • 队列的每个元素都表示为一个3值元组(节点、级别、路径)
    初始队列:(A,0,null)


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

    如何打印队列中的所有路径?您如何解释给定示例中队列中的路径?@FallonX
    Path for current node=(Path from prev node+prev node)
    ,例如,您从A访问B,Path=null+'A'=A.eg2。从C访问E,path='A'+'C'=ACYep,明白了。谢谢如何打印队列中的所有路径?您如何解释给定示例中队列中的路径?@FallonX
    Path for current node=(Path from prev node+prev node)
    ,例如,您从A访问B,Path=null+'A'=A.eg2。从C访问E,path='A'+'C'=ACYep,明白了。谢谢参见的示例参见的示例
    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