转自:http://www.cnblogs.com/jffifa/archive/2011/12/17/2291061.html
研究发现,SPFA加上SLF(Small Label First)优化时,是不能用“某个点的入队列次数>点数”这一条件来判负环的。
数据举例如下:
(u, v, d)
V=4, E=6
0 1 0
0 2 0
0 3 0
2 1 -1
3 1 -2
3 2 -2
则按照SLF,1这个点将被入队5次,而图显然不存在负环(根本不存在环)。
究其原因在于SLF不保证被松弛点在被另外一个点松弛时还在队列中。
那么必须换一种方法判负环。wikipedia提供了一种不错的选择:
易知,无论在什么样的情形下,最短路径本身都不可以包含环。因此,最短路径上的节点个数永远不会超过图中节点的总数。因此,在求解的同时我们可以维护到达某一个节点的当前最短路径所需要经过的节点数,一旦发现到达某一个节点所需要的当前最短路径上的节点总数超过了图中节点的总数,就可以立即判定原图中存在负权回路,因而最短路径不存在。