一、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