1.Bellmen-Ford判定负环
思路:
- 若经过n轮迭代,算法仍未结束(仍有能产生更新的边),则图中存在负环
- 若n - 1轮迭代之内,算法结束(所有边满足三角不等式),则图中无负环
2.SPFA判定负环
思路:
- 设cnt[x]表示从1到x的最短路径包含的边数,cnt[1] = 0。当执行更新dist[y] = dist[x] + z 时,同样更新cnt[y] = cnt[x] + 1。若此时发现cnt[y] >= n,则图中有负环,若算法正常结束则不存在负环。
- 另一种方法是记录每个点的入队次数,次数达到n时说明有负环。
两种方法的比较:一般情况下第二种方法的效率不如第一种的高,例如在n个点构成一个负环的图中,第一种的判定方法只要绕行一次,就能发现负环,而第二种方法要绕环n次。
例题:POJ3259
《算法竞赛进阶指南——李煜东》P361