简介
A* 算法是基于BFS的一种入门级启发式搜索算法,就是将BFS的队列改为基于估价的优先队列,可以快速地找到答案。
算法流程伪代码描述
//优先队列为小根堆
WHILE 优先队列不为空
取出队头并扩展
将扩展节点以估价值+当前值为优先级入队
END WHILE
注意事项
估价函数越接近真实值算法越优,但一定不能大于真实值,否则可能会一直进入错误的迭代而得到错误的答案(即真正可以迭代出答案的节点可能被一直压在优先队列中无法取出)。
特别的,当估价函数恒为0时,A* 算法与普通的优先队列优化BFS无异。
A* 版k短路算法
这里使用A* 求k短路,但不是最优方法,因为A* 会扩展出很多无用节点。
算法流程伪代码描述
//优先队列为小根堆,以第二个成员变量为优先级
//c[x]为x到所求节点的最短路
//w[x,y]为从x到y的边权
WHILE 优先队列不为空
取出队头节点{x,d}
cnt[x]++
IF x是所求节点 THEN
IF cnt[x] == k THEN
返回 d
END IF
END IF
FOR y与x相连
IF cnt[y] == k THEN
CONTINUE
END IF
新建节点{y,d+w[x,y]+c[y]}
节点入队
NEXT y
END WHILE
例题
洛谷P2483 【模板】k短路([SDOI2010]魔法猪学院)
注意事项
这道题A会被卡第11个点的空间,A可得92分(共12个时间点)。
这道题需在程序中计算出k的最大值
m
a
x
{
k
}
=
E
/
c
[
1
]
max \left \{ k \right \} = E/c[1]
max{k}=E/c[1]
c[1]是从第一个元素到第n个元素的最短路。
每次求出第i短路时将E减去该短路长度,若某次取出节点的已求得的路径长度大于E则算法返回。