数据结构课设题目——求第K短的最短路径
来源:互联网 发布:淘宝百度云盘资源暗号 编辑:程序博客网 时间:2024/06/05 09:35
最短路径问题是图论中的一个经典问题,主要研究成果有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),定义为在Ti上,Pi对应的那一分枝中,第1个(按从s到t的顺序)不在Ti - 1上的点(i > 1)。为描述的方便,设dev1为P1的第2个点。因此,在图1中,dev1~dev5的编号分别为2、3、5、4和3。显而易见,devi至少是Pi的第2个点。接下来是Yen算法的核心部分,即每当求出一个Pi时,都可以从Pi上发展出若干条候选路径。发展的方法是这样的,对于Pi上从devi的前一个点到t的前一个点这一段上的每个点v,都可以发展出一条候选路径。用Pi sv表示Pi上从s到v的子路径,用Pi vt表示从v到t的满足下列条件的最短路径:condition 1:设点v在Ti上对应的点为v',则Pi vt上从点v出发的那条边不能与Ti上从点v'出发的任何一条边相同。condition 2:Pi vt上,除了点v,其它点都不能出现在Pi sv上。如果找得出Pi vt,则把Pi sv和Pi vt连起来就组成了一条候选路径。其中condition 1保证了候选路径不与P1~Pi重复;condition 2保证了候选路径无环。
以图6-65中的例子为基础,可以举一个发展候选路径的例子。在求出了P5之后,要在P5上发展候选路径。P5的偏离点是3号点。因此v的范围是{4, 3}。
当v = 4时,Pi sv = 1 -> 4,因此,根据condition 2,在Pi vt上不能出现1号点。找到P5上的4号点在T5上对应的那一点,也就是图6-中位于阴影3号点上面的4号点,在T5上从它出发的有(4, 5)和(4, 3)这两条边,因此,根据condition 1,在Pi vt上不能出现这两条边。假设在这样的情况下,求出了从4号点到t的最短路径为4 -> 2 -> 5,它就是Pi vt。此时发展出的候选路径就是1 -> 4 -> 2 -> 5。
当v = 3时,Pi sv = 1 -> 4 -> 3,因此,根据condition 2,在Pi vt上不能出现1号点和4号点。找到P5上的3号点在T5上对应的那一点,也就是图6-66中阴影的3号点,在T5上从它出发的只有(3, 5)这一条边,因此,根据condition 1,在Pi vt上不能出现边(3, 5)。假设在这样的情况下,我们求出了从3号点到t的最短路径为3 -> 2 -> 5,它就是Pi vt。此时发展出的候选路径就是1 -> 4 -> 3 -> 2 -> 5。
显而易见,在从Pi发展出的所有候选路径中,只有当v是devi的前一个点时,条件1才有可能阻挡掉2条或2条以上边。当v不是devi的前一个点时,条件1只会阻挡掉1条边,那就是本身位于Pi上,从v出发的那条边。不仅从Pi,从之前的P1~Pi - 1,我们都发展过若干条候选路径。从候选路径的集合中取出最短的一条,就是Pi + 1。把Pi + 1从候选路径的集合里删掉;然后再从它发展新的候选路径,添加到候选路径的集合里,如此循环,直到求出Pk为止。如果在求到Pk之前,候选路径的集合就空了,那么说明Pk不存在。
(2) 课程设计目的
学习、掌握、编程实现Yen算法,知道如何求解第K短最短路径。
(3) 基本要求
① 给定一个加权图,编程实现Yen算法,依次输出所有的无环最短路径。
② 候选路径集合用堆存储实现,方便快速选取最短的一条。
③ 分析Yen算法的时间复杂性。
(4) 实现提示
在Yen算法中会调用Dijkstra算法,图可用邻接矩阵表示。
- 数据结构课设题目——求第K短的最短路径
- POJ2449 第k最短路径
- POJ2449 第k最短路径
- 最短路径 k
- POJ 2449 第k长的最短路径
- 数据结构 第15讲 一场说走就走的旅行——最短路径
- 第K短路径
- 【数据结构】最短路径
- 数据结构---最短路径
- 数据结构-最短路径
- 第7章 图——最短路径之某个源点到其余各顶点的最短路径
- BFS求迷宫的最短路径
- 求迷宫的最短路径
- 求迷宫的最短路径
- 图:求图的最短路径
- 数据结构---->图的最短路径
- 题目1100:最短路径
- 题目1100:最短路径
- Hibernate常用方法整理
- J2EE总结--浅识JNDI
- iphone-common-codes-ccteam源代码 CCDylib.m
- 在windows下编译object-c语言
- Moab 5.2.0+Torque 2.2.1/pbs集群作业可视化管理系统部署试验
- 数据结构课设题目——求第K短的最短路径
- Flex代码格式化插件
- extjs 3.4 在IE8下,tabPanel会同时出现纵向、横向滚动条的情况。影响用户体验。
- Linux命令:history的用法
- C++中的域
- Linux - one command per day--diff
- postfix启动问题
- Hadoop MapReduce 学习笔记(一) 序言和准备
- iphone-common-codes-ccteam源代码 CCEmoji.h