Java 解读Dijkstra';s算法

Java 解读Dijkstra';s算法,java,algorithm,dijkstra,Java,Algorithm,Dijkstra,我理解如何找到从开始到结束的最短路径,正如Dijkstra算法所解释的,我不理解的是解释。在这里,从图中的图形来看,从A到E添加到已知集合的顺序是A、C、B、D、F、H、G、E我没有得到的是,如何获得从A到E的路径,如图中所示(数学方面)每个节点都有一个父节点。当您到达'E'时,您只需查看它的父对象,依此类推,直到找到'A'。这样,您将以相反的顺序找到列表。颠倒列表,找到从'A'到'E'的路径 如果您按顺序追加,您的父列表将是'E''G''H''F''B''A' 注意:“父节点”是表的“路径”列


我理解如何找到从开始到结束的最短路径,正如Dijkstra算法所解释的,我不理解的是解释。在这里,从图中的图形来看,从A到E添加到已知集合的顺序是
A、C、B、D、F、H、G、E
我没有得到的是,如何获得从A到E的路径,如图中所示(数学方面)

每个节点都有一个父节点。当您到达
'E'
时,您只需查看它的父对象,依此类推,直到找到
'A'
。这样,您将以相反的顺序找到列表。颠倒列表,找到从
'A'
'E'
的路径

如果您按顺序追加,您的父列表将是
'E''G''H''F''B''A'


注意:“父节点”是表的“路径”列中指示的节点

考虑包含要遍历的路径的最小优先级队列,其中队列上的路径优先级是遍历从根到该边的路径中的边的成本。在算法的每个步骤中,从队列中弹出成本最低的路径,并考虑其每个事件边,使用该事件边扩展路径,并按优先级顺序将新路径推回到队列中。重复此操作,直到第一条路径到达目标

例如:

  • 从空队列开始
  • 然后,从根
    A
    开始,将所有事件边(
    A->B
    A->C
    A->D
    ,成本分别为2、1和4)放入队列并按优先级排序:
    C,1)、(A->B,2)、(A->D,4)>
  • 从队列的前端弹出最小优先级路径<代码> A->C<代码>,然后考虑路径的边缘到路径的结尾<代码> C>代码>并将这些路径推回到队列(保持优先级顺序):<代码> B,2),(A->D,4),(A->C>A,10),(A->C>E,12)>/代码>/LI>
  • 重复,弹出最小优先级路径
    A->B
    并扩展带有事件边的路径:
    D,4)、(A->B->F,4)、(A->B->C,7)、(A->C->A,10)、(A->B->E,12)、(A->C->E,12)>
  • 继续。。。弹出
    A->D
    并推送更多事件边缘:
    B->F,4)、(A->D->C,6)、(A->B->C,7)、(A->C->A,10)、(A->B->E,12)、(A->C->E,12)>
  • 弹出
    A->B->F
    并推送更多事件边缘:
    D->C,6)、(A->B->C,7)、(A->B->F->H,7)、(A->C->A,10)、(A->B->E,12)、(A->C->E,12)>
  • 弹出
    A->D->C
    -但是,我们已经到达了成本较低的
    C
    ,因此可以忽略它
  • 弹出
    A->B->C
    并忽略它
  • 弹出
    A->B->F->H
    并推送更多事件边缘:
    B->F->H->G,8)、(A->C->A,10)、(A->B->E,12)、(A->C->E,12)>
  • 弹出
    A->B->F->H
    并推送更多事件边缘:
    B->F->H->G->F,10)、(A->C->A,10)、(A->B->F->H->G->E,11)、(A->B->E,12)、(A->C->E,12)>
  • 弹出
    A->B->F->H->G->F
    并忽略它
  • 弹出
    A->C->A
    并忽略它
  • 弹出
    A->B->F->H->G->E
    ,我们已经达到了目标(成本为11)
    从开始节点开始,在将图形遍历到可用节点时进行累积权重计算。将从一个节点到相邻节点的累积权重与任何先前结果(即,到该节点的可能遍历)进行比较。然后选择累积重量最低的路线作为“赢家”。该过程将重复,直到找到从起始节点到终端节点的路径并将其计算为最低累积权重

    因此,在您展示的示例中:

    • ACE=12
    • ADCE=17
    • ABE=12
    ABFHGE是唯一一条从开始到结束累积权重最低为11(也是最长路径)的路径(在有向图中)


    当您从一开始计算时,一些路径最初看起来可能较短(AC),但随着算法的进行,这些选择将被放弃,因为从A到E的所有路径都将被探索。

    提示:首先,找到从E到A的路径,然后将其反转。@Kevin:这是一个有向图,因此,从E到A的路径实际上并不是从A到E的路径的倒数(问题中显示的计算无助于构建从E到A的路径)。所以你的提示,正如所呈现的,是不正确的。请注意,“父节点”是表的“路径”列中指示的节点。正如@ruakh在注释中所指出的,这是一个有向图,因此从E到a的路径与从a到E的路径不同。在您的示例中,实际上没有从G到H的路径,因此不起作用。此外,例如,从E到G的重量与从G到E的重量不同。