算法描述: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算法的实现原理,还有为什么按列展开的原因了?