Bellman-Ford(贝尔曼,福特)算法——解决负权边
2016-03-05 13:47
1216 查看
Dijkstra算法不能解决带有负权边的图(边的权值为负数)。而Bellman-Ford算法可以解决这个问题
这个算法是Bellan和Ford各自独立发明的#include<iostream> using namespace std; int main() { int dis[10], bak[10];//bac用来备份dis int n, m, u[10], v[10], w[10], check, flag; int inf = 99999999;//无穷大 cout << " 输入顶点个数和边的条数" << endl; cin >> n >> m; for (int i = 1; i <= m; i++)//读入边 cin >> u[i] >> v[i] >> w[i];//从u到v的边权是w for (int i = 1; i <= n; i++) dis[i] = inf;//初始化数组 dis[1] = 0; for (int k = 1; k <= n - 1; k++) {//bellman算法 for (int i = 1; i <= n; i++) bak[i] = dis[i];//备份数组 for (int i = 1; i <= m; i++) {//进行一轮松弛 if (dis[v[i]] > dis[u[i]] + w[i]) dis[v[i]] = dis[u[i]] + w[i]; check = 0;//检测dis是否需要更新 } for (int i = 1; i <= n; i++) { if (bak[i] != dis[i]) { check = 1; break; } } if (check == 0)//如果没有更新提前结束算法 break; } //检测负权回路 flag = 0; for (int i = 1; i <= n; i++) if (dis[v[i]] > dis[u[i]] + w[i]) flag = 1; if (flag == 1) cout << "含有负权回路" << endl; else{ for (int i = 1; i <= n; i++) cout << dis[i] << " "; } return 0; }
相关文章推荐
- 30道四则运算
- DataGrid 刷新选中问题
- oc去除空格方法和判断空格方法
- 白话Spring(基础篇)---AOP(实例篇-4)
- Android几种在其他线程中更新UI的方法
- PAT1039
- Android 将assets中的文件拷贝到本地SD卡使用
- 安装zookeeper
- 软件工程实验一--编程随机生成30个四则运算,算数包括100以内的整数和真分数。
- UUID 和 GUID 的区别
- Uva536——Tree Recovery
- 连续子数组的最大和 java实现
- <十>RecycleView点击事件
- Android开发学习之路--【前言】
- 【学习C++】1.开始学习C++
- SSL握手
- UESTC P酱的冒险旅途 785 (规律模拟)
- 1026. Table Tennis (30)
- 排序算法稳定性定义及分析
- HDU 5285 wyh2000 and pupil(二分图,染色法)