我今天写一题用到了 spfa 判断负环,突然疑惑了(挺离谱)。
常见的 spfa 判环似乎有两种写法,一种是记录环长,更新的时候(边 u->v )cnt[v]=cnt[u]+1,看会不会超过 n,原理就是如果没有环不可能有最短路径长度超过 n。
第二种就是记录每个点入队次数(叫 cnt[i]吧),我一直写的是“存在 cnt[i]>n”就算有负环,感觉可以理解成每个点最多把这个点更新一次,但我想想又觉得不对,一个点也可以更新多次吧?判 cnt[i]>m 肯定是可以的,因为每条边最多对一个点影响一次,但是判断n可以吗?我以前一直这样写好像还没 WA 过,但今天想一下感觉必须和 m 比较才对呢?
想问一下大佬们,第二种写法是“只有判 m 才对,数据很难卡满所以判 n 通常能过”还是“判 n 就够了”呢?如果是后者可以解释一下吗?
碎碎念:不知道是今天降智了还是咋的呢,被 spfa 困惑呜呜。