1、Dijkstra算法:每次用离源点最短的边去更新其他边,图中不能存在负权边,否则会破坏性质
**2、Bellman_Ford算法:非常暴力地去遍历所有地边,每次对边都进行更新,如果更新次数 > n - 1,则说明存在负权回路 **
下面解释一下为什么Bellman_Ford算法需要遍历 n - 1次:
Bellman-Ford算法是一种用于解决单源最短路径问题的算法,它通过对图中的边进行松弛操作来逐步求解从源点到其他所有顶点的最短路径。
在Bellman-Ford算法中,为了保证找到最短路径,需要进行 n − 1 n-1 n−1次松弛操作,其中 n n n为图中顶点的个数。这是因为在一幅含有 n n n个顶点的图中,任意两个顶点之间的最短路径最多包含 n − 1 n-1 n−1条边。因此,进行 n − 1 n-1 n−1次松弛操作可以确保找到从源点到所有其他顶点的最短路径。
如果在进行 n − 1 n-1 n−1次松弛操作后仍然存在可以继续松弛的边,则说明图中存在负权回路,即存在一个环路,使得沿着这个环路走一圈可以让路径的总权值变小。在这种情况下,Bellman-Ford算法会检测到负权回路并报告图中存在负权回路,因为负权回路会导致最短路径无法确定。
因此,进行 n − 1 n-1 n−1次松弛操作是Bellman-Ford算法的关键步骤,确保找到最短路径并检测负权回路。
3、spfa算法:队列优化版的Bellman算法,防止了一些节点无需更新,但是仍然更新的情况