目录
(一)A*
1)第K短路(困难)
样例解释:
第一行输入 n个点,m条边
接下来m行输入 A->B的 有向边 边权为C
最后一行输入 起点S 终点T 的第K条最短路
特殊情况分析
- 首先先从简单的入手,当起点和终点都是同一个点时,由于题目说:起点和终点至少包含一条边,那么就说明上述的特俗情况不成立,所以需要将此时的第 K 短路 变成 第 K+1短路
- 当K==1时,这个时我们最熟悉的最短路情况,无需过多介绍
A*算法介绍:
参考自:AcWing 178. 第K短路(A* 反向计算最短路作为到终点的估计值) - AcWing
数学证明我是真的不会,但 我可以学
(一)应用场景:
这道题就是A* 算法的模板题目,注意它的特殊之处,每个点可以被重复走过,那么这就意味着起点和终点可以重复走过,具体可看上面的样例图解
(二)暴力思想:
我的暴力想法是:从起点开始,将距离起点最近的点加入至一个集合当中,然后再从集合中依次扩展距离它们的最短距离的点,然后搞一个计数的,谁先到达终点谁就是最短的,每有一个到达中终点,计数器++,那么就证明它是第cnt短的,当然我没有任何的证明佐证这个是正确的
(三)算法优化:
核心思想--->>> A* 反向计算最短路作为到终点的估计值
我来说代码的流程把.....
预处理阶段
- main函数中输入点数,边数 n,m
- main函数中初始化 邻接表的头元素 h[N] ,rh[N] (正向,反向)
- 对于a->b 权重为c 的边 同时建立一条 b->a 权重为c的反向边,注意这里是一定要正向和反向的头节点数组的,而不能像建立无向图一样(只建立正向头节点数组)
- 输入起点S,终点T,第K小,特判情况 1 (起点和终点是同一个的情况)
- 堆优化版