A* 算法求第k短路径
A*算法是一类贪心算法,其可以用于寻找最优路径。我们可以利用A*算法来求第k短路径。
一条路径可以由两部分组成,第一部分是一个从出发到达任意点的任意路径,而第二部分是从第一部分的末端出发,到终点的最短路径。两部分正好可以组成一条路径,且每一条路径都可以分解这两部分(允许任意一部分为空)。因此当我们已知第一部分的路径A时,设第二部分为B,我们可以尝试预估完整的路径A+B的费用(距离),我们将公式定义为:f(A)=g(A)+h(A)。其中g(A)表示第一部分A的已知长度,而h(A)表示路径A到终点的预估最短距离,而f(A)表示路径A的预估总费用。由于A*是贪心算法,因此我们每次都会选择预估总费用最低的路径,并在进行拓展。
下面说明如何用A*算法求解第k短路径。首先我们需要计算从所有结点到终点的最短路径(以终点为起点逆向跑最短路算法)。之后我们维护一个最小堆,在一开始将起点代表的路径加入堆中。我们对路径的评估采用A*的方式,由于每个结点到终点的距离已知,因此h(A)也是确定而非预估的。每次都从堆中取预估费用最小的路径并在其上进行拓展(访问相邻的所有结点并创建新的路径加入堆中,允许新路径上出现重复结点),并将最小路径从堆中移除。在上面过程中我们每次发现路径的末尾是终点,则进行一次计数,直到计数为k,则我们找到了第k短路径。
由于采用的是BFS方式扩展路径,因此可以保证存储在堆中的路径都是不同的。每次找到的最短路径必然是所以以残留在堆中的路径为前缀的从起点到终点的最短路径,可以知道依序找到的路径1,2,...其费用必定非严格递增。而第一次找到的路径显然是最短的。若前n-1次找到的路径是前n-1短的,我们可以保证第n短的路径的某个前缀保留在堆中。若第n短的路径与前n-1条找到的最短路径的最长相同前缀均为0,那么可以保证这个前缀必然是未被消耗的(所有的路径的公共前缀起点在一开始就加入了最小堆中)。而若第n短的路径与第t短路径有最长前缀p,那么两条路径t与路径n的第p+1个结点互不相同,但是由于计算第t短路径时,我们会将路径n的p+1长前缀创建并加入堆中,且一直到第n-1条路径出堆,该p+1长前缀都不会出堆,所以此时该前缀依旧存在于最小堆中。故下一次找到的路径是第n短的路径。
下面说明时间复杂度,利用Dijkstra算法可以在O(|E|log2(|V|))时间复杂度内计算最短路径。之后我们计算每次从堆中弹出完整路径(从起点出发抵达终点的路径)过程中最多有|V|条路径被弹出(最短路径不含环),且这过程中最多有|E|个结点被加入堆中。故堆中最多含有k|E|条路径,因此总的时间复杂度为O(k*(|V|+|E|)log2(k|E|))+O(|E|log2(|V|))=O(k|E|log2(k|E|))。
A* 算法求第k短路径的更多相关文章
- POJ 2449 Remmarguts' Date (第k短路径)
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions:35025 Accepted: 9467 ...
- A* 算法求第 K 短路
一种具有 \(f(n)=g(n)+h(n)\) 策略的启发式算法能成为 A* 算法的充分条件是: 搜索树上存在着从起始点到终了点的最优路径. 问题域是有限的. 所有结点的子结点的搜索代价值 \(> ...
- POJ 3613 快速幂+Floyd变形(求限制k条路径的最短路)
题意: 给你一个无向图,然后给了一个起点s和终点e,然后问从s到e的最短路是多少,中途有一个限制,那就是必须走k条边,路径可以反复走. 思路: 感觉很赞的一个题目,据说证明是什 ...
- poj 2449 第k短路径
思路: 利用一个估计函数g[i]=dis[i]+len.其中len为队列出来的点当前已经走了的距离.dis[i]为该点到终点的最短路径.这样我们只要将点按g[i]的升序在队列你排序,每次取出最小的g[ ...
- aStar算法求第k短路
A*的概念主意在于估计函数,f(n)=g(n)+h(n),f(n)是估计函数,g(n)是n节点的当前代价,h(n)是n节点的估计代价:而实际中,存在最优的估计函数f'(n)=g'(n)+h'(n),那 ...
- [BFS,A*,k短路径] 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 path (Problem - 6705)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=6705 path Time Limit: 2000/2000 MS (Java/Others) Mem ...
- A*算法的认识与求第K短路模板
现在来了解A*算法是什么 现在来解决A*求K短路问题 在一个有权图中,从起点到终点最短的路径成为最短路,第2短的路成为次短路,第3短的路成为第3短路,依此类推,第k短的路成为第k短路.那么,第k短路怎 ...
- POJ - 3255 SPFA+邻接表求次短路径
题意:给出m条边 , n个顶点,u [ i ]到v [ i ] 的距离w [ i ],求除了最短路的那条最短的边的长度. 思路:之前有做过相似的题,使用迪杰斯特拉算法求单源最短路径,并且记录路径,枚举 ...
- POJ 3255 Roadblocks (Dijkstra求最短路径的变形)(Dijkstra求次短路径)
Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16425 Accepted: 5797 Descr ...
随机推荐
- c++中子类转父类,父类转子类
#include <iostream> using namespace std; class Father { public: virtual void show() { cout< ...
- FastAdmin 如何升级?
FastAdmin 如何升级? 官方推荐使用 git 升级 FastAdmin. 升级 FastAdmin 核心代码 git stash git pull git stash pop 更新前端组件 比 ...
- vi/vim显示中文字符并且去掉^M的方法
vim上经常会碰到中文显示不正常的现象,也就是传说中的乱码.搜索了一下,在 http://www.chinalinuxpub.com/bbs/showthread.php?t=45475 找到了一个解 ...
- bzoj 3779 重组病毒——LCT维护子树信息
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3779 调了很久……已经懒得写题解了.https://www.cnblogs.com/Zinn ...
- Extjs tree2
本案例中记载了Extjs中一棵树的形成以及各种案例集成,并详解介绍了TreePanel.TreeNode和AsyncTreeNode这三个主要对象.纯属个人业余时间玩玩的,整理出来,方便以后查看. J ...
- erlang的websocket例子
创建工程 rebar-creator create-app websocket_demo 文件列表 route_helper.erl -module(route_helper). -export([g ...
- 洛谷八连测R4
1.逃避 https://www.luogu.org/problemnew/show/T14561 注意: 1.输入时需要用EOF判断,否则会TLE. 2.用flag判断字符是不是每一句首字母. 3. ...
- java中Mongo
1. query.fields().include("idfa").include("imei").include("id").inclu ...
- 详细讲解删除SQL Server日志的具体方法
一: 删除LOG 1:分离数据库 企业管理器->服务器->数据库->右键->分离数据库 2:删除LOG文件 3:附加数据库 企业管理器->服务器->数据库-> ...
- python学习 (三十) python的函数
1: 函数参数默认值 def method1(p1 = , p2 = ): // 函数有两个参数,并且都有默认值 return p1 + p2 print(method1()) print(meth ...