(1) 问题描述
最短路径问题是图论中的一个经典问题,主要研究成果有Dijkstra、Floyd等优秀算法,Dijkstra算法一直被认为是图论中的好算法。但这两个算法有一个共同的缺陷:这里的最短路径指两点之间最短的那一条路径, 不包括次短、再次短等等路径。实际上,在使用咨询系统或决策支持系统时,希望得到最优的决策参考外,还希望得到次优、再次优等决策参考。这同样反映在最短路径问题上,如一个交通咨询系统,除了希望得到最短路径以外,由于交通堵塞等问题,可能需要获知次短、第K短的最短路径。因此,有必要将最短路径问题予以扩充,能求出第K短最短路径。形式的表述就是想要在图中求出从起点到终点的前k短的路径(最短、第2短、第3短……第k短),并且需要这些路径都是无环的。
常见的较好的求解前k短无环路径的算法是Yen算法(以发明者名字命名的)。现在简要地描述一下Yen算法。设Pi为从起点s到终点t的第i短的无环路径。一开始是P1,也就是从s到t的最短路径,可以通过Dijkstra、Bellman-Ford或BFS等算法轻易地求出。接下来要依次求出P2,P3……Pk。可以将P1~Pi看成一棵树,称为Ti,它的根节点是s,所有叶节点都是t。例如假设s = 1,t = 5,求出的P1~P5为,P1:1->2->3->5;P2:1->3->2->5;P3:1->3->5;P4:1->4->5;P5:1->4->3->5。此时的T5就是如图6-65所示的一棵树。
最短路径问题是图论中的一个经典问题,主要研究成果有Dijkstra、Floyd等优秀算法,Dijkstra算法一直被认为是图论中的好算法。但这两个算法有一个共同的缺陷:这里的最短路径指两点之间最短的那一条路径, 不包括次短、再次短等等路径。实际上,在使用咨询系统或决策支持系统时,希望得到最优的决策参考外,还希望得到次优、再次优等决策参考。这同样反映在最短路径问题上,如一个交通咨询系统,除了希望得到最短路径以外,由于交通堵塞等问题,可能需要获知次短、第K短的最短路径。因此,有必要将最短路径问题予以扩充,能求出第K短最短路径。形式的表述就是想要在图中求出从起点到终点的前k短的路径(最短、第2短、第3短……第k短),并且需要这些路径都是无环的。
常见的较好的求解前k短无环路径的算法是Yen算法(以发明者名字命名的)。现在简要地描述一下Yen算法。设Pi为从起点s到终点t的第i短的无环路径。一开始是P1,也就是从s到t的最短路径,可以通过Dijkstra、Bellman-Ford或BFS等算法轻易地求出。接下来要依次求出P2,P3……Pk。可以将P1~Pi看成一棵树,称为Ti,它的根节点是s,所有叶节点都是t。例如假设s = 1,t = 5,求出的P1~P5为,P1:1->2->3->5;P2:1->3->2->5;P3:1->3->5;P4:1->4->5;P5:1->4->3->5。此时的T5就是如图6-65所示的一棵树。
定义devi为Pi的偏离点(deviation node),