(单源最短路)Bellman-Ford算法

Bellman - Ford算法是求含<b>负权图</b>的单源最短路径算法,效率很低,但代码很容易写。其原理为持续地进行松弛(原文是这么写的,为什么要叫松弛,争议很大),在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无法得出结果,否则就完成。Bellman - Ford算法有一个小优化:每次松弛先设一个标识flag,初值为FALSE,若有边更新则赋值为TRUE,最终如果还是FALSE则直接成功退出。

struct edge {
    int from,to;
    int cost;
};
edge es[MAXE];
int d[MAXV]; // d[i]表示d[start]到i点的最短距离
int v, e; // 顶点数, 边数

void Bellman_Ford(int s) {
    fill(d + 1, d + v + 1, INF);
    d[s] = 0;

    for (int i = 1; i <= v; ++i) {
        bool update = false;
        for (int j = 0; j < e; ++j) {
            if (d[es[j].from] != INF) {
                d[es[j].to] = min(d[es[j].to], d[es[j].from] + es[j].cost);
                update = true;
            }
        }
        if (!update)
            break;
    }
    
    bool flag = false;
    for (int i = 0; i < es.size(); ++i) {
        if (d[es[i].to] > d[es[i].from] + es[i].cost) {
            flag = true;
            break;
        }
    }
    if (flag)
        cout << "图包含了负权环";
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 概述 最短路径是图中的常见问题,最典型的应用是:当我们用百度地图或高德地图引导我们去某个地方时,它通常会给出一...
    CodingTech阅读 1,570评论 4 9
  • Bellman_Ford算法:Bellman_Ford 算法解决的是一般情况下的单源最短路径问题,其边可以为负值。...
    Gitfan阅读 862评论 0 0
  • 趋利避害是人之本能,但在对待婚姻大事时,却时常迷失自己! 1 烨今年31岁,有一个5岁的儿子和75岁的老娘。 烨2...
    刘芷源07阅读 546评论 12 10
  • 那时我们有梦 关于文学 关于爱情 关于穿越时空的旅行 如今我们深夜饮酒 杯子碰到一起 都是梦破碎的声音
    飨客阅读 134评论 4 2
  • 最近一直在思考这个问题 开始我一直以为,自信是从小培养的,来自于爸爸妈妈的鼓励,老师的表扬,从小培养出一种自信的气...
    噢对吧阅读 901评论 1 3