「POJ2499」Remmarguts’ Date
A*算法,k短路问题
题意
给定一张有向图,求s到t的第k短路。
解法
A*算法
A*算法是一种启发式搜索算法。用于在图形平面上,对于有多个节点的路径,求出最低通过成本。
启发式搜索:在当前搜索节点往下一步节点时,可以通过启发函数来进行选择,选择代价最小的节点作为下一步节点而跳转其上。
A*算法的估值函数:
$$f(n)=g(n)+h(n)$$
其中:
$g(n)$是指从初始状态到当前状态n的实际花费。
$h(n)$是指从当前状态n到最终状态的估计费用。
$f(n)$是指初始状态经过目标n到达最终状态的估计花费。
k短路问题
在k短路问题中,$g(n)$表示当前已经走过的距离,$h(n)$为当前点到终点t的最短路;
对于估值函数,定义结构体:
1 | struct A |
使用优先队列维护$f(n)$,使每次取到的最小的$f(n)$即为当前状态到目标点的最小花费;我们可以据此确定选取的顺序,并保证每一次更新的距离一定是当前所有情况能转移到的最小情况。
为了确定目标点被走过的次数,我们通常用$cnt$表示终点被经过的次数当$cnt=k$时,终止循环。
代码
1 |
|