转载注明出自bestsort.cn,谢谢合作
分层图最短路
应用场景
分层图最短路在最短路的基础上,增加了一个条件:可将 n 条边的权值变为 0. 比如说下图: 那么最短路肯定是如下图
但是如果我们能把一条边的权值变为 0 的话,最短路应该是下面这个样子
而分层图就是用来解决这类问题的. 仔细回想下最短路的 floyd 算法,每次对于一个点 k ,用dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j])来择优选择.这里的分层图也是一样的道理,每次对 此条边免费 和 此条边不免费 进行 DP,最终结果便是最优解. 设会有 K 次免费机会,则
dis
的状态转移方程为: dis[i][j]=min(dis[father][j−1],dis[father][j]+w) 其中, father 表示节点i的父亲节点,w 表示节点 i 到 j 的边权.当 j−1>=k 时,dis[father][j]=INF (INF为无穷大,通常用0x3f3f3f3f
表示) 事实上,这个 DP 就相当于把每个结点拆分成了 k+1 个结点,每个新结点代表使用不同多次免费通行后到达的原图结点。换句话说,就是每个结点 u[i] 表示使用 i 次免费通行权限后到达 u 结点。 在代码实现里面,核心代码只不过在最短路的基础上修改了几行用于 DP,代码本身并不难.
这里代码中的最短路部分采用的算法是 **Dijkstra+堆优化
1 |
|
复制