众所周知,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发出边的相同