眾所周知,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發出邊的相同
