浅谈K短路算法(KSP)之二(YEN .J算法求解)

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

对于具有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的算法中,首先定义如下:

A^{k}=1-(2^{k})-(3^{k})-...-Q_{k}^{k}-(N),k=1,2,3,...K,是从起点到终点N的第K短路,其中2^{k}3^{k}、...Q^{k}代表第K短路经上第2个、第3个、第k个节点

A^{k}:第k条最短路径

A^{k-1}:第k-1条最短路径

A^{j},j=1,2,...k-1是个集合,代表前k-1个最短路径的集合

A^{k}是通过A^{j},j=1,2,...k-1求得的,求得的方式如下:

i=1,2,3,..Q_{k-1}i=1,2,3,...Q_{k-1}代表A^{k-1}路径上按照顺序的每个节点,在A^{k-1}路径上,从节点1到节点i的路径设为R_{i}^{k},在节点i上偏离至一个新节点,设此新节点为i+1,要求此i+1节点不与集合A^{j},j=1,2,...k-1在节点i上的下一个节点相同,同时计算通过新节点i+1到达终点N的最短偏离路径,记为S_{i}^{k}S_{i}^{k}路径中的节点不能R_{i}^{k}中的节点相同,则A_{i}^{k}=R_{i}^{k}+S_{i}^{k},代表的是在偏离节点i上,相对于A^{k-1}的偏离路径。由上述步骤可知,A_{i}^{k}是无环的。

2 求解步骤

下面给出具体的求解A^{k}的步骤。

首先维护两个链表ListA,ListB,ListA是已求得A^{k}的集合,ListB是A^{k}的候选集合

(1)求A^{1}A^{1}的求得方式很多,dijkstra,spfa等。在Yen的论文中,求A^{1}是用Yen自己的方法,使用的图是不带负环的图。

(2)对于i=1,2,3,...Q_{k-1}代表A^{k-1}路径上按照顺序的每个节点,已经求得A^{j},j=1,2,...k-1,如果i节点在集合A^{j}中出现过,设d_{iq}=∞,其中q是A^{j}集合中的i+1节点。(i节点至少在A^{k-1}路径上出现过),结束本次循环后,d_{iq}恢复原值。

(3)对图求得节点i到终点N的最短偏离路径,即S_{i}^{k},且这条路径上(S_{i}^{k})的节点与前半部分路径(A^{k-1}上,节点1到节点i的路径,即

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值