题目描述:给定一个带权有向图,询问从起点到终点第k短路径长度,如果没有则输出-1。这个题目数据有特殊之处,就是如果起点与终点重合时,距离0并不算第一短最短路径。
A*算法:使用估值函数来进行搜索,f(n)=g(n)+h(n),其中f(n)表示状态起点经过状态n到状态终点的估值,g(n)为状态起点到状态n的距离值,h(n)为状态n到状态终点的距离值。之所以说f(n)是估值函数是因为,h(n)通常不是准确值而是估计值。该题的状态是(u,g,f)其中u表示当前在点u,且从状态起点到此状态的距离值为g,f是通过dis(u)+g计算得到。
其中dis(u)为点u到终点的最短距离。
每次扩展时使用f最小的状态。搜索时出现第k次终点t时,就能得出答案。
简单证明:f值最小即g+dis(u)最小,则当第一次出现终点t时,就是从起点到终点的最短路径。当舍弃最短路径后,继续扩展状态,可以想到当第二次出现终点t时,就是从起点到终点的第二短路径,所以可以求出第k小最短路径。
代码如下:
#include <