弗洛伊德(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
原创粉丝点击