首先,正如这位同志所说:因为要最终减去 T\times P 个硬币,所以不妨把每条边减去 P,就完美地解决了这个问题。随后要求出到 n 点能最多获得几个硬币,且每条边可以重复走,这不难想出用最长路的方法做,因为有可能获得的硬币数量无上限(即出现正环),所以还需要判正环,因此可以使用 SFPA 实现。我们还需注意到的是如样例三这样的图:
如果只按照上面的做法做,会在 2 号点上浪费太多时间,因为 2 号点上有环,而且 SPFA 算法还会告诉你图中有正环,硬币数量无上限,但是我们可以看到事实并非这样,事实是虽然 2 号点有正环,但一进入 2 号点,也回不来了,无法返回去 n 号点(即 4 号点)的正道了,所以 2 号点的正环其实对答案没有影响。因此,我们不妨建一个反图,从终点 n 出发,使用 DFS 寻找从终点出发能到的点。这样,在 SPFA 时就可以忽略掉从终点 n 出发到不了的点,节省了时间,排除了对答案不影响的正环的干扰,可谓一举两得。