K短路 A*

本文介绍了k短路的概念,以及如何利用启发式搜索求解k短路。通过BFS与优先队列,结合启发函数f=h+g,其中h为已走过路径,g为当前点到终点的最短路径估计。文章以poj2449问题为例,提供了求解模板,并指出起点和终点相同时需特别处理的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、k短路

什么是k短路?最短路就是第一短路,那么第k短的就是k短路。

二、求k短路

首先可以想到在BFS中,从起点开始走,把每个点放入队列中时,以当前走过的距离加上当前点到终点的最短距离的和(即我们假设可以预知走哪个点到终点的距离最短)作为比较条件从小到大排序,当第一个到达终点时,走过的路径长度即为最短路,那么第

k次到达终点的长度显然就是k短路。

那么接下来就是问题的核心了,如何判断哪个点到终点的距离最短呢?即如何可以每次都优先走最有希望到达终点的点?

这里就要用到启发式搜索了,要用到一个启发函数:f=h+g,   h为当前搜索的代价,g为估计函数,这个估计必须小于等于实际值。

h好求,就是当前走过的路径,g呢?估计值不妨就取当前点到终点的最短路径,即等于实际值。放入优先队列中,每次都先出h+g的和小的。当终点第k次出队时,当前终点走过的的路径就是k短路的长度。或者当某个点第k次出队时,答案就是这个点的f的值

启发式搜索实际上就是避免了一些无谓的搜索,使搜索的方向能够朝向正确的方向进行。

关于g的求法,即构建反向边,从终点跑一次最短路即可。

还要注意的一点是,当s==t时,起点和终点一样的时候,因为一定要走距离,所以要k++

下面以poj2449为例,给出模板

#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define exp 1e-8
#define mian main
#define pii pair<int,i
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值