SPFA真的可以做路径统计吗?
我们知道 spfa 跑最短路的时候队列中的点的最短路没有被更新完,此时用他去更新最短路数量难道不会出问题吗?
比如说,对于只有成功被松弛才扔进堆里的代码,有以下数据:
4 4
1 2 2
1 3 1
3 2 1
2 4 3
4 4
1 3 1
3 2 1
1 2 2
2 4 3
1 先更新 2 和 3,然后 2 更新 4,接着 3 更新 2,但是此时 4 没有再被更新,输出变成了 1。
(上面两组数据其实是一样的,但是对于链式前向星,因为边是从前面插入的,所以需要第二个数据才能使 2 先入队。第一个数据是对于 vector 存图的。反正最终目的都是让 3 在 2 更新完 4 后再更新 2)
还有一种错得离谱的写法就是松弛成功或当前路径长度与原先最短路长度一样就更新,还是上面的数据就能卡掉,因为它会重复计算。
对于上面这种做法,有一种代码是每次更新完后将当前点的 cnt(即路径数)清零,可以保证代码正确性。这也是题解区中数量最多的题解。(指 SPFA 的题解中)但是这样的话每多一条边都要重新扫一次,复杂度不是上天?
所以说,归更到底,因为 SPFA 队列中的点的最短路径并不能像 dijkstra 那样已经确定,所以要么错误更新,要么复杂度上天,其实 SPFA 是不能做最短路计数的。
其他地方我没有疑惑,唯一的问题就是第三种写法复杂度是不是特别高?这个复杂度我不会证明。如果确实复杂度极高,那 SPFA 确实做不了最短路计数,还请管理员撤下所有 SPFA 题解并添加 hack 数据。