Floyd算法(弗洛伊德算法) 百度百科
2016-03-09 21:15
211 查看
核心代码
for(int k=1; k<=NODE; ++k)//对于每一个中转点 for(int i=0; i<=NODE; ++i)//枚举源点 for(int j=0; j<=NODE; ++j)//枚举终点 if(distmap[i][j]>distmap[i][k]+distmap[k][j])//不满足三角不等式 { distmap[i][j]=distmap[i][k]+distmap[k][j];//更新 path[i][j]=k;//记录路径 }
状态转移方程
其状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};map[i,j]表示i到j的最短距离,K是穷举i,j的断点,map[n,n]初值应该为0,或者按照题目意思来做。
当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路。
时间复杂度与空间复杂度
编辑时间复杂度:O(n^3);
空间复杂度:O(n^2)[1]
优缺点分析
编辑Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行V次SPFA算法。
优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
缺点:时间复杂度比较高,不适合计算大量数据。
算法描述
编辑a) 初始化:D[u,v]=A[u,v]
b) For k:=1 to n
For i:=1 to n
For j:=1 to n
If D[i,j]>D[i,k]+D[k,j] Then
D[i,j]:=D[i,k]+D[k,j];
c) 算法结束:D即为所有点对的最短路径矩阵
参考代码
编辑
C语言
C++语言
相关文章推荐
- DropDownMenu下拉筛选排序Menu
- ubuntu技巧--ubuntu下升级cmake
- 小试牛刀
- Treasure the new start, freshmen!
- Floyd算法(弗洛伊德算法) 百度百科
- 实习一周总结
- Android新手入门2016(5)--HelloWorld工程结构分析
- HTML5中没有cellspacing和cellpadding怎么办
- Android--持久化技术
- c++多线程编程(二)
- 二进制基础
- 【问题解决】远程服务器Ubuntu Server 14.04.1 LTS搭建LAMP环境
- linux启动流程
- 【原】[UIImage imageWithContentsOfFile:]引发的图片无法显示的问题
- c++多线程编程(一)
- LightOJ 1278 - Sum of Consecutive Integers (求一个数能被分解为等差数列的方案数)
- 状态模式
- USB设备检测的一般过程
- 跨域方法汇总
- js原生拖放