对于具有n个顶点和m条边且边的权值非负的简单图(无重边和环),K短路,是指的起点s到终点t的最短路径中第k个最小的。K短路分为有限制的K短路和无限制的K短路,有限制的K短路是指求得的路径中不含有回路(路径上任何一个节点的出现次数不大于1次),无限制的K短路则对求得的路径中没有要求,这篇博客讨论后者。
1、基础理论
1.1 偏离路径
算法主要使用了偏离路径的思想,主要概念如下:
偏离点:两条路径中按顺序出现最后一个相同的点,即出现的第一个不相同的点的前一个点,也可以理解为从偏离点开始,两条路径开始不同
偏离边:两条路径中出现的第一条不相同的边
偏离路径:从偏离点到终点N的路径

设在一个图中有如下两条最短路径p1、p2,起点为节点0,终点为节点5,见上图所示,每条路径经过的顶点如下:
p1:0-2-3-5
p2:0-2-4-5
则p2相对于p1的偏离点是节点2,p2相对于p1的偏离边是2-4,p2相对于p1的偏离路径为2-4-5。
1.2 相关定义
在Yen的算法中,首先定义如下:
,是从起点到终点N的第K短路,其中
、
、...
代表第K短路经上第2个、第3个、第k个节点
:第k条最短路径
:第k-1条最短路径
是个集合,代表前k-1个最短路径的集合
是通过
求得的,求得的方式如下:
设=1,2,3,..
代表
路径上按照顺序的每个节点,在
路径上,从节点1到节点
的路径设为
,在节点
上偏离至一个新节点,设此新节点为
,要求此
节点不与集合
在节点
上的下一个节点相同,同时计算通过新节点
到达终点N的最短偏离路径,记为
,
路径中的节点不能
中的节点相同,则
,代表的是在偏离节点
上,相对于
的偏离路径。由上述步骤可知,
是无环的。
2 求解步骤
下面给出具体的求解的步骤。
首先维护两个链表ListA,ListB,ListA是已求得的集合,ListB是
的候选集合
(1)求。
的求得方式很多,dijkstra,spfa等。在Yen的论文中,求
是用Yen自己的方法,使用的图是不带负环的图。
(2)对于代表
路径上按照顺序的每个节点,已经求得
,如果
节点在集合
中出现过,设
=∞,其中q是
集合中的
节点。(
节点至少在
路径上出现过),结束本次循环后,
恢复原值。
(3)对图求得节点到终点N的最短偏离路径,即
,且这条路径上(
)的节点与前半部分路径(
上,节点1到节点
的路径,即

该博客详细介绍了如何使用Yen算法求解无向图中起点到终点的K条最短路径。算法基于偏离路径思想,通过不断偏离现有最短路径找到新的候选路径。博客中给出了具体步骤和一个示例图,展示了一个6顶点9边的图的K短路求解过程,并提供了C++代码实现。
最低0.47元/天 解锁文章
3731

被折叠的 条评论
为什么被折叠?



