最短路--Bellman-Ford

Bellman-Ford 贝尔曼-福特

算法思想

贝尔曼-福特算法(英语:Bellman–Ford algorithm),求解单源最短路径问题的一种算法,由理查德·贝尔曼 和 莱斯特·福特 创立的。它的原理是对图进行次松弛操作,得到所有可能的最短路径。其优于迪科斯彻算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达O(|N||M|)。但算法可以进行若干种优化,提高了效率。

首先指出,图的任意一条最短路径既不能包含负权回路,也不会包含正权回路,因此它最多包含|N|-1条边。
枚举n次,每次枚举每一条边,如果dis[u] > dis[v]+w[v][u],则dis[u] = dis[v]+w[v][u],如果图没有负环则最多跑n-1次,否则可以一直跑下去

模板

bool Bellman_Ford(int s)
{
    memset(dis,inf,sizeof dis);
    dis[s] = 0;
    bool flag;
    for(int i = 1; i <= n; i++) //n个点,跑n次
    {
        flag = false;
        for(int j = 0; j < m; j++) //m条边,每次枚举每一条边
        {
            int x = edge[j].u;
            int y = edge[j].v;
            int z = edge[j].w;
            if(dis[y] > dis[x]+z)
            {
                dis[y] = dis[x]+z;
                flag = true;
            }
        }
        if(!flag) break;
        if(i==n && flag) return false;//存在负环
    }
    return true;
}

例题

参考博客

百度百科
https://www.cnblogs.com/CLAYzhan/articles/11621448.html

猜你喜欢

转载自www.cnblogs.com/hezongdnf/p/11972680.html