📜  Bellman-Ford算法(1)

📅  最后修改于: 2023-12-03 14:59:30.959000             🧑  作者: Mango

Bellman-Ford算法介绍

Bellman-Ford算法是一种单源最短路径算法,可求解带有负权边的图的最短路径。该算法以图中的所有边作为起点,重复“松弛”所有边的操作,直到没有任何边可以被松弛为止。该算法的时间复杂度为O(V*E),其中V是图中所有顶点的数量,E是图中所有边的数量。

算法步骤
  1. 初始化:将源点距离所有其他点的距离设为无穷大,源点距离自身设为0。
  2. 对于每一轮迭代,重复以下操作:
    • 遍历所有边,对于每条边,如果起点到该边的终点的距离加上该边的权值,小于当前终点的已知最短距离,则更新终点的最短距离为当前值。
  3. 重复步骤2直到没有任何边需要被更新为止。
代码实现
//初始化距离数组
for(int i=0;i<V;i++){
    distance[i] = INT_MAX;
}
distance[source] = 0;

//重复松弛操作直到不再有可更新的边
for(int i=0;i<V-1;i++){ //最多需要V-1轮松弛操作
    for(int j=0;j<E;j++){ //遍历所有边
        if(distance[edges[j].src] != INT_MAX && distance[edges[j].src] + edges[j].weight < distance[edges[j].dest]){
            distance[edges[j].dest] = distance[edges[j].src] + edges[j].weight; //更新距离数组
        }
    }
}
适用场景

Bellman-Ford算法适用于带有负权边的图,但不能处理带有负环的图。当图中存在负环时,算法会进入无限循环。同时,该算法的时间复杂度较高,对于大型图效率不高,应考虑其他算法。