单源最短路+A*算法==第K短路
A*算法是一种启发式搜索方法,与bfs,dfs的区别在于它可以利用一个启发函数进行选择,使搜索的时间复杂度被大大的优化。
A*主要的公式表达式为f(n)=g(n)+h(n);
其中 f(n) 是从初始点经由节点n到目标点的估价函数,
g(n) 是在状态空间中从初始节点到n节点的实际代价,
h(n) 是从n到目标节点最佳路径的估计代价。
那么在第K短路问题中,g(i)为从初始点出发到当前该节点的距离,h(i)为当前该节点到结束点最短路距离。
A*算法的代码:
int Astar_Kth(int s,int t,int k)
{
priority_queue<num>Q;
num temp;
temp.u=s,temp.d=0,temp.h=dis[s];
Q.push(temp);
if(s==t)
k++;
while(!Q.empty())
{
temp=Q.top();
Q.pop();
int v=temp.u;
cnt[v]++;
if(cnt[v]>k)
continue;
if(cnt[t]==k)
return temp.d;
for(int i=0;i<V[v].size();i++)
{
int to=V[v][i];
int s=pre[v][i];
num next;
next.u=to,next.d=temp.d+s,next.h=dis[to];
Q.push(next);
}
}
return -1;
}