Warshall算法求传递闭包以及为什么要按列展开

算法描述:Warshall算法是求传递闭包的有效算法,算法步骤如下

相信给出了算法的实现步骤,大多数人都可以跟着步骤把代码打出来把。

算法实现:

 代码实现:

import java.util.Scanner;

class Warshall{
    private int [][]matrix;

    public void settMatrix(int[][] matrix){
       this.matrix=matrix;
    }

    public void rankWarshall(){
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[i].length;j++){
                if(matrix[j][i]==1){
                    for(int k=0;k<matrix.length;k++){
                        matrix[j][k] = matrix[j][k]|matrix[i][k];
                    }
                }
            }
        }
    }
    public void printf(){
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[i].length;j++){
                System.out.print(matrix[i][j]+" ");
            }
            System.out.println();
        }
    }
}
public class Transmit {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int [][] mar = new int[4][4];
        for(int i=0;i<mar.length;i++){
            for(int j=0;j<mar[i].length;j++){
                mar[i][j] = in.nextInt();
            }
        }
        Warshall warshall = new Warshall();
        warshall.settMatrix(mar);
        warshall.rankWarshall();
        warshall.printf();
    }
}

看到这里相信大家都能理解Warshall算法是怎么计算的了。

那接下我们就说说为什么Warshall要按列展开,而不按行展开。

先说说按行展开时的设计思路,相信大家都坐过高铁,也知道有中转站,那如果我们按行展开的话,当我们遍历完一遍数组的时候,是不是就不会再去遍历同一行数组,意思就是我们做高铁从广州到北京,我们已经到了北京,但是这时候突然在北京和广州之间新建了一个中转站,那你是不是不知道这里又多了一个中转站,你总不能回到广州,再坐一次高铁到北京吧,所以按行展开就会造成这个后果。

换个角度理解,按行展开其实就是从广州开始一个个找中转站,直到找到北京为止,但是按列展开就是中转站去找广州和北京的路线,最后结合起来,就形成了一个高铁线路。简单点来说就是一个从起点开始找终点,一个从中点开始向两边分别找起点和终点,最后直到线路形成。

理解了么?不理解的话我换个角度,画个图加深下印象

 好了,这就是Warshall算法的实现原理,还有为什么按列展开的原因了?

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值