弗洛伊德(Floyd)算法 Java实现
来源:互联网 发布:软件架构图 工具 编辑:程序博客网 时间:2024/06/05 15:23
代码所示图:
图1:
图2:
代码:
public class ShortestPathFloyd { /** 邻接矩阵 */ private int[][] matrix; /** 表示正无穷 */ private int MAX_WEIGHT = Integer.MAX_VALUE; /**路径矩阵*/ private int[][] pathMatirx; /**前驱表*/ private int[][] preTable; /** * 创建图2 */ private void createGraph2(int index) { matrix = new int[index][index]; int[] v0 = { 0, 1, 5, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT }; int[] v1 = { 1, 0, 3, 7, 5, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT }; int[] v2 = { 5, 3, 0, MAX_WEIGHT, 1, 7, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT }; int[] v3 = { MAX_WEIGHT, 7, MAX_WEIGHT, 0, 2, MAX_WEIGHT, 3, MAX_WEIGHT, MAX_WEIGHT }; int[] v4 = { MAX_WEIGHT, 5, 1, 2, 0, 3, 6, 9, MAX_WEIGHT }; int[] v5 = { MAX_WEIGHT, MAX_WEIGHT, 7, MAX_WEIGHT, 3, 0, MAX_WEIGHT, 5, MAX_WEIGHT }; int[] v6 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 3, 6, MAX_WEIGHT, 0, 2, 7 }; int[] v7 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 9, 5, 2, 0, 4 }; int[] v8 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 7, 4, 0 }; matrix[0] = v0; matrix[1] = v1; matrix[2] = v2; matrix[3] = v3; matrix[4] = v4; matrix[5] = v5; matrix[6] = v6; matrix[7] = v7; matrix[8] = v8; } /** * 创建图1 */ private void createGraph1(int index) { matrix = new int[index][index]; int[] v0 = { 0, 1, MAX_WEIGHT, MAX_WEIGHT, 2, MAX_WEIGHT }; int[] v1 = { 1, 0, 1, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT }; int[] v2 = { MAX_WEIGHT, 1, 0, 1, MAX_WEIGHT, MAX_WEIGHT }; int[] v3 = { MAX_WEIGHT, MAX_WEIGHT, 1, 0, 1, MAX_WEIGHT }; int[] v4 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 1, 0, 1 }; int[] v5 = { MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 1, 1, 0 }; matrix[0] = v0; matrix[1] = v1; matrix[2] = v2; matrix[3] = v3; matrix[4] = v4; matrix[5] = v5; } public void floyd(){ //路径矩阵(D),表示顶点到顶点的最短路径权值之和的矩阵,初始时,就是图的邻接矩阵。 pathMatirx = new int[matrix.length][matrix.length]; //前驱表(P),P[m][n] 的值为 m到n的最短路径的前驱顶点,如果是直连,值为n。也就是初始值 preTable = new int[matrix.length][matrix.length]; //初始化D,P for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix.length; j++) { pathMatirx[i][j] = matrix[i][j]; preTable[i][j] = j; } } //循环 中间经过顶点 for (int k = 0; k < matrix.length; k++) { //循环所有路径 for (int m = 0; m < matrix.length; m++) { for (int n = 0; n < matrix.length; n++) { int mn = pathMatirx[m][n]; int mk = pathMatirx[m][k]; int kn = pathMatirx[k][n]; int addedPath = (mk == MAX_WEIGHT || kn == MAX_WEIGHT)? MAX_WEIGHT : mk + kn; if (mn > addedPath) { //如果经过k顶点路径比原两点路径更短,将两点间权值设为更小的一个 pathMatirx[m][n] = addedPath; //前驱设置为经过下标为k的顶点 preTable[m][n] = preTable[m][k]; } } } } } /** * 打印 所有最短路径 */ public void print() { for (int m = 0; m < matrix.length; m++) { for (int n = m + 1; n < matrix.length; n++) { int k = preTable[m][n]; System.out.print("(" + m + "," + n + ")" + pathMatirx[m][n] + ": "); System.out.print(m); while (k != n) { System.out.print("->" + k); k = preTable[k][n]; } System.out.println("->" + n); } System.out.println(); } } public static void main(String[] args) { ShortestPathFloyd floyd = new ShortestPathFloyd(); floyd.createGraph2(9);// floyd.createGraph1(6); floyd.floyd(); floyd.print(); }
图1:
图2:
(0,1)1: 0->1(0,2)4: 0->1->2(0,3)7: 0->1->2->4->3(0,4)5: 0->1->2->4(0,5)8: 0->1->2->4->5(0,6)10: 0->1->2->4->3->6(0,7)12: 0->1->2->4->3->6->7(0,8)16: 0->1->2->4->3->6->7->8(1,2)3: 1->2(1,3)6: 1->2->4->3(1,4)4: 1->2->4(1,5)7: 1->2->4->5(1,6)9: 1->2->4->3->6(1,7)11: 1->2->4->3->6->7(1,8)15: 1->2->4->3->6->7->8(2,3)3: 2->4->3(2,4)1: 2->4(2,5)4: 2->4->5(2,6)6: 2->4->3->6(2,7)8: 2->4->3->6->7(2,8)12: 2->4->3->6->7->8(3,4)2: 3->4(3,5)5: 3->4->5(3,6)3: 3->6(3,7)5: 3->6->7(3,8)9: 3->6->7->8(4,5)3: 4->5(4,6)5: 4->3->6(4,7)7: 4->3->6->7(4,8)11: 4->3->6->7->8(5,6)7: 5->7->6(5,7)5: 5->7(5,8)9: 5->7->8(6,7)2: 6->7(6,8)6: 6->7->8(7,8)4: 7->8
0 0
- 弗洛伊德(Floyd)算法 Java实现
- 弗洛伊德(Floyd)算法
- 弗洛伊德(Floyd)算法
- 弗洛伊德(Floyd)算法
- 弗洛伊德(Floyd)算法
- Floyd算法(弗洛伊德算法)
- 弗洛伊德(Floyd)算法过程
- 弗洛伊德(Floyd)算法过程
- A*寻路 -- 弗洛伊德(Floyd)算法
- 最短路径--弗洛伊德(Floyd)算法
- 最短路-弗洛伊德(Floyd)算法
- 最短路之Floyd(弗洛伊德)算法
- 多源最短路径问题-弗洛伊德(Floyd)算法
- 弗洛伊德算法(Floyd)
- 弗洛伊德(Floyd)算法
- 弗洛伊德(Floyd)算法
- 【弗洛伊德Floyd算法验证】
- 数据结构之---C语言实现最短路径之Floyd(弗洛伊德)算法
- 一篇日志弄清RecycleView
- Fighting
- zip压缩多个路径的文件或目录到指定zip
- 代码逻辑的检验
- 正则中需要转义的特殊字符小结
- 弗洛伊德(Floyd)算法 Java实现
- Handler 系列二:通信
- angularjs框架下controller间的传值方法
- webpack2-webpack.config.js配置
- Django学习资料
- 原码、反码、补码和移码其实很简单
- Android studio常见问题
- 66. Plus One
- nginx设置图片防盗链