动态规划的Warshall和Floyd算法:

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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值