算法

Bellman_Ford算法

2019-09-28  本文已影响0人  _NewMoon

Bellman_Ford算法也是单源最短路径算法中的一种,不同于一般Dijkstra算法的是,它可以
解决带负权图的最短路问题,不过该算法的时间复杂度较高,O(nm),n为顶点的个数,m为边的个数

算法的主要思路:

for(int i = 0 ; i<k ;i++)
    {
        memcpy(backup,dist,sizeof dist);
        
        for(int j = 0; j<m ;j++)
        {
            int a = edge[j].a, b = edge[j].b, w = edge[j].w;
            dist[b] = min(dist[b],backup[a] + w);  //松弛操作
        }
    }

第一层循环的意思,经过不超过k条边,得到的图中所有点的最短距离
第二层循环类似于之前的Dijkstra算法,用当前点来更新最短距离,这步操作叫做松弛

注意1

在第二层循环之前,需要对dist做一个备份backup,目的是为了防止上一次的距离更新对
这次的更新造成影响,从而得到错误的结果

注意2

图中可能存在负权回路,但只要该负权回路的位置不在答案的那条路径上,那么它对结果
没有影响,否则,可能得出负无穷的结果(在负权回路上迭代”无穷次“)。

上一篇下一篇

猜你喜欢

热点阅读