zoukankan      html  css  js  c++  java
  • bellman-ford算法

    什么是Bellman-Ford算法?

     Bellman-Ford,是求解单源最短路经问题的一种算法,由Richard Bellman和莱斯特.福特创立的。它的原理是对图进行|V|-1次松弛操作,得到所有可能的最短路经。其优于Dijkstra的方面是边的权值可以为负数、实现简单,缺点是时间复杂度高,高达O(V*E),V:顶点数,E:边数。但算法可以进行优化,以提高效率。

    Bellman-Ford与Dijkstra的相同点:

    • 计算时每个边的之间的估计距离值都比真实值大,并且被新找到的路经的最小长度替代。

    不同点:

    • Dijkstra算法是从源点s出发向外扩,逐个处理相邻的节点,不会去重复处理节点,这样处理会比Bellman-Ford效率更高一点;
    • Bellman-Ford算法每次都是从源点s重新出发进行relax操作,共V-1次,V是顶点数;

    算法思想 (例子)

    • 初始化时把起点s到各个顶点v的距离dist(s->v)设为∞,dist(s->s)设为0;
    • 计算最短路经,执行V-1次遍历;
      • 对于图中的每条边:如果起点s的距离d加上边的权值w小于终点v的距离d,则更新终点v的距离值d;
    • 检测图中是否有负权边形成了环,遍历图中的所有边,计算s至v的距离,如果对于v存在更小的距离,则说明存在环;

    Bellman-Ford算法的用途

    • 从A出发,是否存在到达各个节点的路经(有计算出值表示可以到达);
    • 从A出发,到达各个节点最短路经(时间最少、或者路经最少等);
    • 图中是否存在负环路(权重之和为负数);

    Leetcode例子

  • 相关阅读:
    定时器实现点击重新发送信息倒计时显示
    新浪微博5s钟后跳转页面
    时钟制作代码
    判断线段相交
    POJ1265:Area(多边形面积公式+pick公式) 好题
    ACM零散知识
    POJ2318:TOYS(叉积判断点和线段的关系+二分)&&POJ2398Toy Storage
    计算几何初步认识
    UVA10026:Shoemaker's Problem(贪心)
    UVA10020:Minimal coverage(最小区间覆盖)
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13130033.html
Copyright © 2011-2022 走看看