第K短路

来源:互联网 发布:linux系统安装方法 编辑:程序博客网 时间:2024/05/21 07:14

单源最短路+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