【图论】第k短路

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)\)

可持久化可并堆优化

posted @ 2021-02-10 04:57  purinliang  阅读(108)  评论(0编辑  收藏  举报