解读Dijkstra的算法

时间:2015-04-20 18:33:09

标签: java algorithm dijkstra

Graph

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

3 个答案:

答案 0 :(得分:10)

每个节点都有一个父节点。当您到达'E'时,只需查看其父级,依此类推,直至找到'A'。这样您就可以按相反的顺序找到列表。将列表反转以查找从'A''E'的路径。

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

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

答案 1 :(得分:1)

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

例如:

  1. 以空队列<>
  2. 开头
  3. 然后,从根A开始,将所有事件边缘(A->BA->CA->D分别放入成本2,1和4)到队列中并按优先顺序排列:<(A->C,1),(A->B,2),(A->D,4)>
  4. 从队列前面弹出最小优先级路径A->C,然后考虑事件发生在路径C末尾的边缘,并将这些路径推回到队列中(保持优先级顺序) :<(A->B,2),(A->D,4),(A->C->A,10),(A->C->E,12)>
  5. 重复,关闭最小优先级路径A->B并使用事件边缘扩展路径:<(A->D,4),(A->B->F,4),(A->B->C,7),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
  6. 继续......弹出A->D并推送更多事件边缘:<(A->B->F,4),(A->D->C,6),(A->B->C,7),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
  7. 弹出A->B->F并推送更多事件边缘:<(A->D->C,6),(A->B->C,7),(A->B->F->H,7),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
  8. pop A->D->C - 但是,我们已经使用较低的费用路径到达C,因此可以忽略它。
  9. pop A->B->C并忽略它。
  10. 弹出A->B->F->H并推送更多事件边缘:<(A->B->F->H->G,8),(A->C->A,10),(A->B->E,12),(A->C->E,12)>
  11. 弹出A->B->F->H并推送更多事件边缘:<(A->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)>
  12. pop A->B->F->H->G->F并忽略它。
  13. pop A->C->A并忽略它。
  14. pop A->B->F->H->G->E我们已达到目标(费用为11)!

答案 2 :(得分:0)

从起始节点开始,在将图形遍历到可用节点时进行累积权重计算。将从一个节点到相邻节点的累积权重与任何先前结果(即,到该节点的可能遍历)进行比较。然后选择具有最低累积权重的路线作为“赢家”。重复该过程,直到找到从开始到终端节点的路径并评估为最低累积权重。

所以在你展示的例子中:

  • ACE = 12
  • ADCE = 17
  • ABE = 12

ABFHGE是唯一一条路径(在有向图中),从开始到结束,累计权重最低为11(也是最长路径)。

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