A*算法:
单源单汇第k短路:
给定一个源点s和一个汇点t,求解从s到t的第k短路。
建立反图,从反图中,以t为源点跑单源最短路,得到原图中i点到t点的最短路val[i](也就是反图中t点到i点的最短路)
用val[i]作为估价函数,当前状态(dis[i],i)的距离为dis[i],把(dis[i]+val[i],i)这个状态加入优先队列。每次从优先队列中取出最小值点u,枚举其出边,把其所有的出边的所有状态(dis[u]+w+val[v],v)无条件加入优先队列。
也就是说,整个过程中保存着任意一条从s开始的路径的状态,每次取出到t的距离估价最小的状态进行扩展,意味着从这个状态开始全部走最短路到达t。每个节点u第i次从优先队列中被取出时,对应的就是(在目的地为t的前提下)到达i的第k短状态。所以每个点只需要取出至多k次这个状态,大于k次的状态不需要更新后续状态。时间复杂度为 (O((nk+m)logm))