动态规划的Warshall和Floyd算法:
2015-06-04 21:10
169 查看
Warshall算法
简单的讲就是
伪代码:
代码:
时间复杂度为n^3,空间复杂度是n^2。
Floyd算法:Floyd算法可以用于构造无向或有向加权图(不包含长度为负的回路)的完全最短路径:
与Warshall算法基本相同:
伪代码
代码:
简单的讲就是
伪代码:
代码:
package Section8; /*第八章 动态规划 有向图传递闭包的Warshall算法*/ public class Warshall { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[][] AdjMat = { {0,1,0,0}, {0,0,0,1}, {0,0,0,0}, {1,0,1,0} }; int[][] BiBao = Warshall(AdjMat); System.out.println("输出表达传递闭包的矩阵:\n"); for(int i = 0;i < BiBao.length;i++) { for(int j = 0;j < BiBao.length;j++) System.out.print(BiBao[i][j] + " "); System.out.println(); } } public static int[][] Warshall(int[][] AdjMat){ //接受一个图的邻接矩阵为参数,返回表达它的传递闭包的矩阵 int[][] Rresult = AdjMat; //初始结果R0 int n = AdjMat.length; for(int k = 0;k < n;k++) //R0到Rn,做n步变换 { int[][] Rtemp = new int ; //每循环一下求下次结果 for(int i = 0;i < n;i++) for(int j = 0;j < n;j++) { if(Rresult[i][j] == 1) Rtemp[i][j] = 1; else if(Rresult[i][k] == 1 && Rresult[k][j] == 1) Rtemp[i][j] = 1; else Rtemp[i][j] = 0; } Rresult = Rtemp; } return Rresult; } }
时间复杂度为n^3,空间复杂度是n^2。
Floyd算法:Floyd算法可以用于构造无向或有向加权图(不包含长度为负的回路)的完全最短路径:
与Warshall算法基本相同:
伪代码
代码:
package Section8; /*第八章 动态规划 完全最短路径的Floyd算法*/ public class Floyd { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int[][] WeightMat = { {0,1000,3,1000}, {2,0,1000,1000}, {1000,7,0,1}, {6,1000,1000,0} }; int[][] Result = Floyd(WeightMat); System.out.println("输出表达完全最短路径的矩阵:\n"); for(int i = 0;i < Result.length;i++) { for(int j = 0;j < Result.length;j++) System.out.print(Result[i][j] + " "); System.out.println(); } } public static int[][] Floyd(int[][] WeightMat){ //接受一个图的权重矩阵,返回表达完全最短路径的矩阵 int n = WeightMat.length; int[][] Result = WeightMat; for(int k = 0;k < n;k++) //进行n次变换,每次加入第k个点 { int[][] temp = new int ; for(int i = 0;i < n;i++) for(int j = 0;j < n;j++) temp[i][j] = min(Result[i][j],Result[i][k]+Result[k][j]);//加入第k个点后路径是否能缩短 Result = temp; } return Result; } private static int min(int m,int n){ if(m < n) return m; return n; } }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#数据结构与算法揭秘二
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析
- C#常见算法面试题小结
- JavaScript 组件之旅(二)编码实现和算法
- JavaScript数据结构和算法之图和图算法