题意:求第k短路。
上次做图论最短路的时候,无意间看到这求第k短路的算法,然后就顺势初学一下A*算法。
以下转载自魏神:http://blog.csdn.net/sdj222555/article/details/7690081
网上大部分的方法都是用A* + 最短路的方法做的。
对于A* ,估价函数 = 当前值+当前位置到终点的距离,即 F(p)=g(p)+h(p),每次扩展估价函数值中最小的一个。对于k短路来说,g(p)为当前从s到p所走的长度,h(p)为从p到 t 的最短路的长度,则F(p)的意义就是从s按照当前路径走到 p 后要走到终点 t 一共至少要走多远。也就是说我们每次的扩展都是有方向的扩展,这样就可以提高求解速度和降低扩展的状态数目。为了加速计算,h(p)需要从A*搜索之前进行预处理,只要将原图的所有边反向,再从终点 t 做一次单源最短路径就可以得到每个点的h(p)了。
在下面这个代码中:A结构体中,v代表的是当前走到的点,f和g分别为f函数和g函数的值,每次优先搜的是f函数较小的。这样就能保证搜索出来的一定是第K小短路,并且避免了一定的不必要计算。
自己滴感觉:上次做的时候看到A*,所以就百度了这算法,里面全名启发度算法,是人机全自动的算法,所以启发度嘛,当然得高自动能力才强。记不太清了,里面好像是说spfa+dfs是最烂的A*算法,因为启发度为0。因为这是第一道有A*算法的,所以先做这道,对A*有初步认识,再找时间顺势学A*算法。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include