转载注明出自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 |
|

