POJ 2449(A*算法与最短路算法)

该博客探讨了如何利用A*算法解决POJ 2449问题,这是一个寻找有向图中从起点到终点第k短路径的问题。文章介绍了A*算法的基本原理,包括估值函数f(n) = g(n) + h(n)的计算,其中f(n)、g(n)和h(n)分别代表不同含义的距离。在算法实现中,关键在于每次选择f值最小的状态进行扩展,并在找到第k次终点时得到答案。博主提供了相应的代码实现。
摘要由CSDN通过智能技术生成

题目描述:给定一个带权有向图,询问从起点到终点第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 <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值