Yen's Algorithm


论文中用到了Yen’s Algorithm来求图中 固定两点间 前K条最短路径,所以在这里与大家分享一下我的总结。

简介

Yen’s Algorithm是用于“在有N个节点的非负距离的网中,从一个固定点到所有其他点的所有最短路径的长度”or“求图中固定两点——而非任意两点——间的前K条最短路径”,它能发现,采用了递推法中的偏离路径算法思想,适用于非负权边的 有向? 无环图结构。算法的整体思想就是循环or递归使用Dijkstra——首先使用Dijkstra找到起终点两点间的最短路径,然后在保证起终点不变的前提下,逐段设置长度为∞(在将下一段长度设为无穷大时,恢复此段的正常长度),找到可以替换该段的最短路径。此处注意,每次只换一段、一个节点,换第二个节点时,第三个节点不动,即求第一个节点,在不经过原来第二个节点的情况下,如何最短地链接第三个节点。

算法过程

首先使用了Dijkstra算法,求得两点间最短路径。
然后将最短路径中包含的每一段路径逐段设为∞,(自认)在将下一段设为∞时,上一段的∞恢复原值代码实际也非常简单,仅需将该段路径剔除考虑范围之外——以邻接表的图为例,仅需将起点所在行的终点节点排除在考虑范围之外——即可,并不需要设定一个无穷大的值,因为设立无穷大这一步操作本身的目的也是不考虑这段路径了),重新运行Dijkstra算法,寻找最短路径——即在保证起点、终点不变的前提下,找到其它几条 次最短 路径。
例如,在A1-A2-A3-A4-A5的路径中,先考虑最短路径中的其它节点不变,只换A2,A2换成哪个节点路径最短;然后考虑只换A3,A3换成哪个节点路径最短。依次往后。

最后,从这几条路径中选出一条第二短路径。其它候选路径保留,继续作为第三条最短路径的候选路径。

Java实现

后续补充

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Yen算法和MPS算法是两种用于求解K最短路径问题的算法。它们的目标是在给定的图中找出K条最短路径。 Yen算法是一种改进的A*算法,它的核心思想是通过不断地从当前最短路径中删除一条边,然后再计算从起点到终点的最短路径,以此来寻找更短的路径。具体来说,Yen算法使用了一个优先队列来维护当前的最短路径,每次从队列中取出最短路径并计算其偏离路径,直到找到K条最短路径或者队列为空。Yen算法的时间复杂度在最坏情况下约为O(K * N^2 * lg(K * N))。 MPS算法是在Yen算法的基础上进行了优化。它使用了一种排序的策略来加快寻找偏离边的速度。具体来说,MPS算法将从每个点出发的所有边按照从该条边走向终点的最短距离进行升序排序,这样一来,寻找偏离边的时间就只有O(1)了。MPS算法的时间复杂度在最坏情况下约为O(N^2 * lgN + K * N)。 综上所述,Yen算法和MPS算法都是用于求解K最短路径问题的算法,它们的时间复杂度都与图的规模N和需要找到的最短路径数K有关。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Yen 算法](https://blog.csdn.net/KZM2008/article/details/5460152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值