Bellman_Ford 算法
来源:互联网 发布:风险矩阵法三个区 编辑:程序博客网 时间:2024/05/22 06:25
Bellman-ford算法
简介
是求含负权图的单源最短路径算法,由于浪费了许多时间做无必要的松弛,效率很低,但代码很容易写。即进行不停地松弛,每次松弛把每条边都更新一下,若n-1次松弛后还能更新,则说明图中有负环,无法得出结果,否则就成功完成。Bellman-ford算法有一个小优化:每次松弛先设一个标识flag,初值为FALSE,若有边更新则赋值为TRUE,最终如果还是FALSE则直接成功退出。
证明
图的任意一条最短路径既不能包含负权回路,也不会包含正权回路,因此它最多包含|v|-1条边。从源点s可达的所有顶点如果存在最短路径,则这些最短路径构成一个以s为根的最短路径树。Bellman-Ford算法的迭代松弛操作,实际上就是按顶点距离s的层次,逐层生成这棵最短路径树的过程。在对每条边进行第1遍松弛的时候,生成了从s出发,层次至多为1的那些树枝。也就是说,找到了与s至多有1条边相联的那些顶点的最短路径;对每条边进行第2遍松弛的时候,生成了第2层次的树枝,就是说找到了经过2条边相连的那些顶点的最短路径……。因为最短路径最多只包含|v|-1 条边,所以,只需要循环|v|-1 次。每实施一次松弛操作,最短路径树上就会有一层顶点达到其最短距离,此后这层顶点的最短距离值就会一直保持不变,不再受后续松弛操作的影响(但是,每次还要判断松弛,这里浪费了大量的时间)
注意:上述只对正权图有效。如果存在负权不一定第i次就能确定最短路,且与边的顺序有关。如果没有负权回路,由于最短路径树的高度最多只能是|v|-1,所以最多经过|v|-1遍松弛操作后,所有从s可达的顶点必将求出最短距离。如果 d[v]仍保持 +∞,则表明从s到v不可达。如果有负权回路,那么第 |v| 遍松弛操作仍然会成功,这时,负权回路上的顶点不会收敛。
代码
bool Bellman_Ford(){ for(int i=1; i<=V; i++){ dis[i] = 1e9; } bool flag; for(int i=0; i<V-1; i++){//flag加以优化 flag = false; for(int j=1; j<=num; j++){ if(dis[node[j].to] > dis[node[j].from] + node[j].cost){ dis[node[j].to] = dis[node[j].from] + node[j].cost; flag = true; } } if(!flag) break;//发现一条最短路直接退出循环 } for(int i=1; i<=num; i++){///判定负环 if(dis[node[i].to] > dis[node[i].from] + node[i].cost) return true; } return false;}
0 0
- Bellman_ford算法
- Bellman_ford算法
- Bellman_ford算法
- Bellman_Ford 算法
- Bellman_Ford算法
- Bellman_Ford算法
- Bellman_Ford算法
- Bellman_Ford算法
- Bellman_Ford算法->SPFA算法
- Spfa算法+bellman_ford算法
- POJ 3259 bellman_ford算法
- POJ 1860 bellman_ford算法
- Bellman_Ford算法求最短路径
- bellman_ford算法 python实现
- Bellman_ford算法,SPFA
- poj1860 Bellman_ford算法
- poj3259 Bellman_ford算法
- SPFA算法 Bellman_ford优化
- 魅族屏幕失灵门:官方延保维修被指消极
- Linux环境变量的设置和查看方法
- 懒加载
- 解析MTK获取系统时间函数大全
- Android开发初学者必看文档:Android开发规范
- Bellman_Ford 算法
- 启动项目,报错404
- CCTableView使用注意事项
- 今天开始重拾旧知识
- 【问题】multiple definition of `_start'
- iOS本地通知:UILocalNotification
- 解决:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 80后创业故事之:兄弟散伙,创业失败
- iOS 真机