Yen算法求K条最短路径

众所周知,Dijkstra算法可以求得一条最短路径,但如果想求多条短路径或者最短路径有多条时,无法求得,需要用到Yen算法。

 1 Yen算法原理

  • 首先利用Dijkstra算法求得从源节点到目的节点的第一条最短路径Q(1)。
  • 求接下来K-1条短路径时,采用递推法中的偏离路径算法思想。
  • 在求Q(i+1)时,将Q(1)上除了目的节点外的所有节点都视为偏离节点,并计算每个偏离节点到目的节点之间的最短路径,然后将其与Q(1)上的源节点到偏离节点的路径拼接到一起共同构成候选路径,从而求得最短偏离路径。

 2 Yen算法举例说明

      

     源点C,终点H

    1)通过最短路径算法Dijkstra得到C到H的最短路径

         Q(1)=C-E-F-H(5)

    2)  偏离点C,E,F

    3)  C->H,候选路径:C-D-F-H(8)

    4)  E->H,候选路径:C-E-G-H(7)

    5)  F->H,候选路径:C-E-F-G-H(8)

    6)  第二短路径:Q(2)= C-E-G-H(7)

3 补充知识点(Yen算法)

  Q:如何从候选列表中选出合适的路径

  如果路径权值和最小的路有多条:从其中选出节点数最少的路径。

  Q:求Vi到终点d的最短路径

  设起点为s,终点为t,偏离点为Vi。求偏离点到终点的最短路径时要注意两个问题

(1)防止从起点到终点的整体路径有环

         从Vi到t的最短路径不能包含s到Vi的路径上的任何节点

(2)避免与已经在结果列表中的路径重复

        从Vi发出的边不能与结果列表中的路径p1,p2,...pk,上从Vi发出边的相同

作者:天际使徒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/Horizon-asd/p/12602273.html