⑨讲图论第五课: Bellman-Ford算法求最短路
2013-02-12 20:48
211 查看
贝尔曼-福特算法(Bellman-Ford)是由 RichardBellman 和 Lester Ford 创立的,求解单源最短路径问题的一种算法。有时候这种算法也被称为Moore-Bellman-Ford 算法,因为 Edward F. Moore 也为这个算法的发展做出了贡献。它的原理是对图进行V-1次松弛操作,得到所有可能的最短路径。其优于迪科斯彻算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达O(VE)。但算法可以进行若干种优化,提高了效率。
自然语言描述
对有向图G(V,E),用贝尔曼-福特算法求以Vs为源点的最短路径的过程:
建立dist[],表示目前已知源点到各个节点的最短距离,起始值dist[s]=0 ,其余皆为OO。
建立pred[],pred[]表示某节点路径上的父节点,起始值皆为NULL。
对(Vi,Vj)∈E,比较dist[Vi]+(Vi,Vj)和dist[Vj],并将小的赋给dist[Vj],如果修改了dist[Vj]则pred[Vj]=Vi(松弛操作)
重复以上操作V-1次
再重复操作一次,如dist[Vj]>dist[Vi]+(Vi,Vj),则此图存在负权环。
原理
松弛
每次松弛操作实际上是对相邻节点的访问,第次松弛操作保证了所有深度为n的路径最短。由于图的最短路径最长不会经过超过条边,所以可知贝尔曼-福特算法所得为最短路径。
负边权操作
与迪科斯彻算法不同的是,迪科斯彻算法的基本操作“拓展”是在深度上寻路,而“松弛”操作则是在广度上寻路,这就确定了贝尔曼-福特算法可以对负边进行操作而不会影响结果。
负权环判定
因为负权环可以无限制的降低总花费,所以如果发现第次操作仍可降低花销,就一定存在负权环。
自然语言描述
对有向图G(V,E),用贝尔曼-福特算法求以Vs为源点的最短路径的过程:
建立dist[],表示目前已知源点到各个节点的最短距离,起始值dist[s]=0 ,其余皆为OO。
建立pred[],pred[]表示某节点路径上的父节点,起始值皆为NULL。
对(Vi,Vj)∈E,比较dist[Vi]+(Vi,Vj)和dist[Vj],并将小的赋给dist[Vj],如果修改了dist[Vj]则pred[Vj]=Vi(松弛操作)
重复以上操作V-1次
再重复操作一次,如dist[Vj]>dist[Vi]+(Vi,Vj),则此图存在负权环。
原理
松弛
每次松弛操作实际上是对相邻节点的访问,第次松弛操作保证了所有深度为n的路径最短。由于图的最短路径最长不会经过超过条边,所以可知贝尔曼-福特算法所得为最短路径。
负边权操作
与迪科斯彻算法不同的是,迪科斯彻算法的基本操作“拓展”是在深度上寻路,而“松弛”操作则是在广度上寻路,这就确定了贝尔曼-福特算法可以对负边进行操作而不会影响结果。
负权环判定
因为负权环可以无限制的降低总花费,所以如果发现第次操作仍可降低花销,就一定存在负权环。
for (int loop=1;loop<=n;loop++) { flag=true; for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) { if (a[i][j]!=0) { if (dist[j]>dist[i]+a[i][j]) { dist[j]=dist[i]+a[i][j]; flag=false; } } } } if (flag)break; }
相关文章推荐
- ⑨讲图论第五课: Bellman-Ford算法求最短路
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路)Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- [算法与数据结构] - No.10 图论(3)- 最短路Dijkstra算法、Bellman-Ford算法和Floyd算法
- poj Wormholes (最短路 spfa Bellman-Ford 算法 邻接表实现)
- poj3259 bellman_ford 算法 判环 最短路
- ACM模板 Bellman_Ford,单源最短路,图论
- 最短路 - bellman-ford 算法模板
- 带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析
- 模板--Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 算法-从动态规划到贪心算法,Bellman-Ford和Dijkstra算法求解最短路
- 图论最短路之bellman-ford
- nullnull图论最短路之bellman-ford
- 算法导论-----图论-----Bellman-ford 算法
- 图论: bellman_ford 求单源最短路…
- 广度优先搜索以及队列优化的 Bellman-Ford 短路算法
- poj 2240(bellman_ford 算法)(最短路负权)Arbitrage
- 算法基础篇:常见图论最短路算法(Bellman-Ford→SPFA→Dijkstra Floyd-Warshall )入门以及代码解析
- 图论 最短路 Bellman_Ford 专题
- 浅谈最短路中的Bellman–Ford 算法 (SPFA