次短路,第k最短路,有限制的最短路问题总结

在这求第k短路用的是,A*+dij所谓的A*是一种启发式搜索,他给搜索选定一定的方向,避免了无谓的搜索,如何来确定搜索的顺序?也就是用一个值来表示这个值为f[x],每次搜索取f[x]最小的拓展,那么这个f[x]=h[x]+g[x]其中这个h[x]就是当前搜索时的代价,如求K段路这个就是前一个点的h[x']+边的长度,而g[x]是一个估价函数,估价函数要小于是对当前点到目标的代价的估计,这个估计必须小于等于实际值,否则会出错。A*的关键也就是构造g[x],我们的dij算法。最短路就是一种A*搜索,其中g[x]=0。

而这里要说的求K短路一种方法,就是用BFS+A*来搜索的过程,g[x]的设定为到这个点到目标点的最短路(这个可以用dij一次求出)径,显然其实小于等于实际值的,h[x]就是搜索到这个点的代价(及走过的路程),用一个优先队列来做,每次取出h[x]+g[x]最小的点来拓展。拓展,也就是通过这点来更新其能直接经过一条边到达的点,这里做好一个新点就丢进优先队列里去,反正总会从对首弹出h[x]+g[x]最小的点。

首先,我们在放优先队列的是这样的节点,他包括,从原点到达本节点的路径长度len,然后我们在优先列里,按照len+dis[i](dis到达终点的最短路)的最小,优先级排队,那么当我们第一次搜索到E点时,这时肯定是最短路径,第二次取出的,就是第二短路,以此类推,从而可以求出第k短路。

struct cnode
{
    int u;
    int len;
    cnode (int uu,int ww):u(uu),len(ww){}
    friend bool operator < (cnode a,cnode b)
    {
        return a.len+dis[a.u]>b.len+dis[b.u];
    }
};

我们从一个点,如何扩展下一个点呢,就是将与相连的点,入队列(这样就会走重复的边),队列里面的节点就是,原点经过len的路经所到达的状态

int A_star(int s)
{
    int i;
    if(dis[s]==inf)return -1;//这个一定要有,若s到t不连通的话,下面会 死循环
    priority_queue<cnode>que;
    CL(tol,0);
    que.push(cnode(s,0));
    while(!que.e
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值