本题正解应为拓扑排序(线性复杂度),但通常的写法可能会出现 WA on #3/#11 或者两者都有的情况。
如果采用 SPFA,其实即使是在 DAG 的条件下也可以卡掉(例如一大堆三角形构造出的卡 SPFA 就满足 DAG,只是没故意去卡而已)。
如果采用 Dij,理论上不可以处理最长路问题,一种方法是将 vis 去掉,有点像 SPFA,只是换成优先队列而已,理论上也可以卡到指数级。
如果你写的是拓扑,但是 WA 了,一种最便于理解,最简单的解决方案:
- 首先,不把全图跑一遍tarjan,只 tarjan(S) 即可。如果深搜找不到某个点,那么意味着 S (起点)不可能到达它,没必要考虑。
- 其次,上面的方法注定有些点 属于哪个scc 的数组 的值为 0,建边时要注意这一点,既不能自环,两边也都不应为 0。
这样写就可以用你最喜欢的拓扑排序 AC 本题啦!