思路来源
https://blog.csdn.net/berrykanry/article/details/78345894(通俗易懂解释好评)
https://www.cnblogs.com/yyf0309/p/8438849.html(可惜看不懂可持久化可并堆)
题意
给定一个图,求第k短路,
相同长度不同路径的路被认为是不同的路,
若不存在输出-1。
题解
我才不会说我八数码题tleMLE了两天后补了一下A*算法又被安利来看这个破题
以终点为S进行dijkstra/spfa,
(具体实现可以建反向图)
然后得到了真实的评估函数h(n)的表,
这样我到了一个点,就知道已走路g(n)+前方最短路h(n)这条路的cost,
把它记为截止到该点的理想最短路。
显然,我们从起点dis[n]即最短路开始延展,
相当于bfs,由起点转向其一步可达点,
即由最短路,转向了后续状态可能换了一条边的最短路。
后者是实际意义上的次短,第三短等等等…
而没换边的路,被加进优先队列里之后,
由于其距离小,还应处在队顶的位置,只是其截止点往后推了一个,
若不存在环,最终所有点的截止点都会被推到终点,
而我们只需要这其中的前k个。
而由于优先队列按距离排序,
当其到达终点的时候,对终点计贡献,
说明这些路是截止到终点的,长度严格递增的路。
当计到第k时,即为起点可达终点的k短路。
这个题,引发了我深深的感慨。
在人生之路上,当你还在为自己的前途备一个list,
记录第一志愿,第二志愿,……,第k志愿并在线为其比较的时候,
早就有人已经洞若观火,知道自己第一志愿应该报哪,
并且,为了选择第k志愿,明明知道最短路在哪,
不惜比照着自己已经打好的dijkstra表,
开始往那些非最短路的地方瞎走???
瞎走一步,啊,这次走到了次短路,加到队列里,
瞎走两步…瞎走k步,啊终于找到了我要的k短路
高考空了50分 终于考上了理想第k大学 既视感
代码
#include
#include
#include
#include
#include
#include
#include