[ABC061D]Score Attack/「模板」Bellman-ford 算法

时间:2021-08-11
本文章向大家介绍[ABC061D]Score Attack/「模板」Bellman-ford 算法,主要包括[ABC061D]Score Attack/「模板」Bellman-ford 算法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

做了这题我发现

  1. 我不懂单源最短路。
  2. BF 还是有用的。

给出有向图,求单源最长路,或指出有环。

开始时觉得这不是直接写个 spfa 记录一下每个点更新次数解决?然后就 WA 了。
其实这是一个严重的历史遗留问题,即学习最短路算法时不经 BF 直接学习并记下 SPFA
首先,WA 是很显然的,比如下面这幅图。

出现环了不代表在到 \(n\) 的路上一定有。那难道要找出每个环上的点并一一判断是否在到 \(n\) 的路径上吗?其实并不是,只需要对代码进行小小的改动就可以了。

先回到 BF,BF 的流程是这样的:

  1. 迭代 \(n-1\) 次。
  2. 每一次尝试松弛每条边。

\[\boxed{ \begin{aligned} \text{Be}&\text{llman-Ford 伪代码}\\ \hline 1.\ &\text{for } i = 1 \to n-1 \\ 2.\ & \kern{2em}\text{for } j = 1 \to m \\ 3.\ & \kern{4em} d_{v_j} = \min\{d_{v_j}, d_{u_j} + l_j\}\\ \end{aligned} } \]

其实感性理解一下十分的简单,就是一个 dp 的思想,因为每个路径不可能有超过 \(n-1\) 条边,而每次进行一次迭代时会让最短路延长上 \(1\),所以迭代 \(n-1\) 次就可以出结果了。

那么如何判环呢?很简单,如果再来一次某个点的最短路又双叒叕被更新了,那么在前往其的路径上肯定有一个环。注意,是前往其的路径上有一个环

未完待续。

原文地址:https://www.cnblogs.com/Acfboy/p/15128913.html