Bellman-Ford——解决负权边
来源:互联网 发布:centos rar 安装 编辑:程序博客网 时间:2024/06/06 09:23
Dijkstra算法虽好,但是不能解决带负权边的图,而Bellman-Ford就是解决这个问题的
在一个含有n个顶点的图中,任意两点之间的最短路径最多包含n-1条边,最短路径中不可能包含回路.
最短路径是一个不包含回路的简单路径,回路分为正权回路(回路权值之和为正)和负权回路(回路权值之和为负). 如果最短路径中包含正权回路,那么去掉这个回路,一定可以得到更短的路径;如果最短路径中包含负权回路,那么肯定没有最短路径,因为每多走一次负权回路就可以得到更短的路径. 因此最短路径肯定是一个不包含回路的最短路径,即最多包含n-1条边.
算法的主要思想:首先dis数组初始化顶点u到其余各个顶点的距离为∞,dis[u] = 0. 然后每轮对输入的所有边进行松弛,更新dis数组,至多需要进行n-1可以求出顶点u到其余各顶点的最短路径,因为任意两点之间的最短路径最多包含n-1条边,所以只需要n-1轮就行.
Code:
#include <stdio.h>#include <string.h>#include <stdlib.h>#define INF 999999int main(int argc, char const *argv[]){int i, j, n, m;int dis[10], temp[10], u[10], v[10], w[10];int check, flag = 0;scanf("%d %d", &n, &m);for(i = 1; i <= m; ++i){scanf("%d %d %d", &u[i], &v[i], &w[i]);}for(i = 1; i <= n; ++i){dis[i] = INF;}dis[1] = 0;/// Bellman-Ford算法主要代码for(j = 1; j < n; ++j) /// 最多循环n-1轮{for(i = 1; i <= n; ++i){temp[i] = dis[i]; /// 对BellmanFord优化,有可能在n-1轮松弛之前就已经计算出最短路径,所以先备份dis数组}for(i = 1; i <= m; ++i) /// 最核心的3句Bellman-Ford算法{if(dis[v[i]] > dis[u[i]] + w[i]){dis[v[i]] = dis[u[i]] + w[i];}}check = 0; /// 检测dis数组是否有更新for(i = 1; i <= n; ++i){if(temp[i] != dis[i]){check = 1;break;}}if(!check) /// 没有更新则提前退出程序{break;}}for(i = 1; i <= m; ++i) /// n-1次之后最短路径还会发生变化则含有负权回路{if(dis[v[i]] > dis[u[i]] + w[i]){flag = 1;}}if(flag){printf("负权回路");}else{for(i = 1; i <= n; ++i){printf("%d ", dis[i]);}}printf("\n");system("pause");return 0;}
0 0
- Bellman-Ford——解决负权边
- Bellman-Ford算法——解决负权边
- Bellman-Ford算法——解决负权边
- 6.3Bellman-Ford——解决负权边
- Bellman-Ford-解决负权边—C
- Bellman-Ford------解决负权边
- Bellman-Ford---解决负权边
- Bellman-Ford -解决负权边
- Bellman-Ford-解决负权边
- Bellman——ford
- poj3259 bellman—ford
- POJ1860—Bellman-Ford算法
- Arbitrage--(Bellman—Ford)
- Bellman-Ford(贝尔曼,福特)算法——解决负权边
- Bellman-Ford——解决负权边(求某点到所有点的最短距离)
- 最短路径(三)—Bellman-Ford算法(解决负权边)
- 单源最短路径——Bellman--Ford算法
- 最短路——Bellman-Ford
- 关于更新发布CSS和JS文件的缓存问题
- Mac英文版MyEclipse 10运行tomcat日志乱码
- ubuntu 15.10 编译安装conkeror
- 《大话数据结构》笔记[1]
- iOS 判断网络请求是否成功
- Bellman-Ford——解决负权边
- .htaccess 绑定子目录
- pch文件的作用以及xcode6.0之后如何手动配置
- Apache POI组件操作Excel,制作报表(三)
- 利用iTunes和iMovie进行音频分割和拼接
- [LeetCode] Permutations II
- 算法优化:从1天到1s
- 实习篇---第十二天
- LINUX C 如何让写文件更快