zcq
    Floyd算法解决最短路径问题。

    1. package com.atguigu.floyd;
    2. import java.util.Arrays;
    3. public class FloydAlgorithm {
    4. public static void main(String[] args) {
    5. // 测试看看图是否创建成功
    6. char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
    7. //创建邻接矩阵
    8. int[][] matrix = new int[vertex.length][vertex.length];
    9. final int N = 65535;
    10. matrix[0] = new int[] { 0, 5, 7, N, N, N, 2 };
    11. matrix[1] = new int[] { 5, 0, N, 9, N, N, 3 };
    12. matrix[2] = new int[] { 7, N, 0, N, 8, N, N };
    13. matrix[3] = new int[] { N, 9, N, 0, N, 4, N };
    14. matrix[4] = new int[] { N, N, 8, N, 0, 5, 4 };
    15. matrix[5] = new int[] { N, N, N, 4, 5, 0, 6 };
    16. matrix[6] = new int[] { 2, 3, N, N, 4, 6, 0 };
    17. //创建 Graph 对象
    18. Graph graph = new Graph(vertex.length, matrix, vertex);
    19. //调用弗洛伊德算法
    20. graph.floyd();
    21. graph.show();
    22. }
    23. }
    24. // 创建图
    25. class Graph {
    26. private char[] vertex; // 存放顶点的数组
    27. private int[][] dis; // 保存,从各个顶点出发到其它顶点的距离,最后的结果,也是保留在该数组
    28. private int[][] pre;// 保存到达目标顶点的前驱顶点
    29. // 构造器
    30. /**
    31. *
    32. * @param length
    33. * 大小
    34. * @param matrix
    35. * 邻接矩阵
    36. * @param vertex
    37. * 顶点数组
    38. */
    39. public Graph(int length, int[][] matrix, char[] vertex) {
    40. this.vertex = vertex;
    41. this.dis = matrix;
    42. this.pre = new int[length][length];
    43. // 对pre数组初始化, 注意存放的是前驱顶点的下标
    44. for (int i = 0; i < length; i++) {
    45. Arrays.fill(pre[i], i);
    46. }
    47. }
    48. // 显示pre数组和dis数组
    49. public void show() {
    50. //为了显示便于阅读,我们优化一下输出
    51. char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };
    52. for (int k = 0; k < dis.length; k++) {
    53. // 先将pre数组输出的一行
    54. for (int i = 0; i < dis.length; i++) {
    55. System.out.print(vertex[pre[k][i]] + " ");
    56. }
    57. System.out.println();
    58. // 输出dis数组的一行数据
    59. for (int i = 0; i < dis.length; i++) {
    60. System.out.print("("+vertex[k]+"到"+vertex[i]+"的最短路径是" + dis[k][i] + ") ");
    61. }
    62. System.out.println();
    63. System.out.println();
    64. }
    65. }
    66. //弗洛伊德算法, 比较容易理解,而且容易实现
    67. public void floyd() {
    68. int len = 0; //变量保存距离
    69. //对中间顶点遍历, k 就是中间顶点的下标 [A, B, C, D, E, F, G]
    70. for(int k = 0; k < dis.length; k++) { //
    71. //从i顶点开始出发 [A, B, C, D, E, F, G]
    72. for(int i = 0; i < dis.length; i++) {
    73. //到达j顶点 // [A, B, C, D, E, F, G]
    74. for(int j = 0; j < dis.length; j++) {
    75. len = dis[i][k] + dis[k][j];// => 求出从i 顶点出发,经过 k中间顶点,到达 j 顶点距离
    76. if(len < dis[i][j]) {//如果len小于 dis[i][j]
    77. dis[i][j] = len;//更新距离
    78. pre[i][j] = pre[k][j];//更新前驱顶点
    79. }
    80. }
    81. }
    82. }
    83. }
    84. }