动态规划的Warshall和Floyd算法:

来源:互联网 发布:矩阵式组织属于 编辑:程序博客网 时间:2024/06/05 14:18

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[n][n];    //每循环一下求下次结果            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[n][n];            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;    }}
0 0
原创粉丝点击