1.贝尔曼—福特算法(Bellman-Ford)
贝尔曼-福特算法是一种用于解决带有负权边的单源最短路径问题的算法。它是以其发明者之一理查德·贝尔曼和鲍曼·福特命名的。
该算法的基本思想是从源节点开始,通过不断迭代更新节点的最短路径值,直到找到所有节点到源点的最短路径。算法中使用数组来存储每个节点的最短路径值,并通过逐步松弛每条边来更新这些值。
具体步骤如下:
1.初始化:将源节点的最短路径设为0,其他节点的最短路径值设为 ∞ ∞ ∞。
2.对于每个节点,依次遍历所有的边,进行松弛操作:如果通过当前节点可以获得更短的路径,则更新该节点的最短路径值(如果dst[v] < dst[u] + w,则dist[v] = dst[u] + w)。
3.如果遍历中有节点被更新,那么重复执行第2步,直到没有发生任何节点最短路径估计值的更新为止。
4.如果已经进行N-1次遍历后还需要遍历,则证明这个图有负环。
5.在执行完所有的迭代之后,如果存在负权环,算法将会报告该图中存在负权环。否则,最终得到的距离数组即为每个节点到源节点的最短路径值。
Bellman-Ford算法
贝尔曼-福特算法的时间复杂度为O(NM),其中N是节点数,M是边数。由于需要遍历所有节点和边,因此该算法适用于稀疏图或者边数较少的情况。
贝尔曼-福特算法不能处理存在负权环的图。如果存在负权环,则最短路径可能不存在或者具有无限小的长度。在实际应用中,可以通过检测负权环来判断图是否具有最短路径。
实现:
vector<int> dst(n+1,INF)