第K短路

单源最短路+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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值