博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
弗洛伊德(Floyd)算法 Java实现
阅读量:2431 次
发布时间:2019-05-10

本文共 4874 字,大约阅读时间需要 16 分钟。

代码所示图:

图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

你可能感兴趣的文章
虎牙直播在微服务改造方面的实践和总结
查看>>
微服务精华问答 | 在使用微服务架构时,您面临哪些挑战?
查看>>
Kubernetes 调度器实现初探
查看>>
边缘计算精华问答 | 边缘计算有哪些应用场景?
查看>>
数据中台精华问答 | 数据中台和传统数仓的区别是什么?
查看>>
如何用30分钟快速优化家中Wi-Fi?阿里工程师有绝招
查看>>
【C语言】C语言中常用函数源代码【strncpy ,strncat ,strncmp】
查看>>
【Java】【算法练习】题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历的结果。如果是输出yes,不是输出no,数组任意两个数字不相同。
查看>>
【Java】【多线程】—— 多线程篇
查看>>
【计算机网络】—— TCP/IP篇
查看>>
【Java】【算法】——算法篇
查看>>
【Java】【数据库】知识重点——数据库篇
查看>>
【Java】知识重点——消息队列篇
查看>>
【Java】学习总结 —— HashMap之put()方法实现原理
查看>>
【计算机网络】【TCP】如何讲清楚Tcp的三次握手和四次挥手?
查看>>
【Java】-- Java核心知识点总结
查看>>
【数据库】SQL之重点知识点总结
查看>>
【计算机网络】计算机网络知识总结
查看>>
【Java】【Web】JavaWeb相关知识总结 2018-9-17
查看>>
【数据库】突破单一数据库的性能限制——数据库-分库分表总结 2018-9-20
查看>>