论文中用到了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实现
后续补充