题目链接:
题意:给出n个点m条边的有向图。输出从s到t的前K短路。
思路:首先,从t开始遍历一次得到每个点到t的最短路dis[i],且得到一棵最短路树,即边<u,v,d>满足dis[u]=dis[v]+d。那么,从任意一个节点到t的最短路都对应最短路树上的一条路径。对于不在最短路树上的边e<u,v,d>,如果我们走了这条边,则长度要增加det(e)=d+dis[v]-dis[u]。那么,我们可以计算出所有不在最短路树上的边的det值。那么除最短路外的每一条路径都是走了若干条不在最短路树上的边,也就是dis[s]加了几个det。那么问题转化成每次选出一些det值,使得这些值的和依次递增。当然这些选出的det不能乱选,他们要在一条路径上。接下来,为每个点u建立一个小根堆H1(u),H1(u)堆中的每个点是从u出发的非树边的det值。接着,对于树边<u,v>,我们要将H1(v)接在H1(u)下面得到H2(u),且H2(u)还是一个小根堆 。设H2(u)的根节点为head[u],最后从head[s]开始得到前K个解。
#include #include #include #include #include #include #include #include #include #include #include