最短路径之Warshall

前言:今天又再一次看到这个算法了,突然的就回忆起大一上离散课的时候,老师在上面讲的那个算法。突然缓的一下就明白了这一个算法,还记得当初听得懵懵逼逼的。嘻嘻,可能当时上课老是走神。


 

优缺点:

为了求得每两点间的间距,我们可以采用这个算法,这个算法的好处就是短,哈哈哈,五行收工,但是不足就是时间复杂度有点太高了。他的时间复杂度带到 N 的三次方。以后我们在介绍其他比较节约时间的算法。

 

思想:

这个算法用到的思想就是动态规划,一个for循环,从利用一个点,到采取全部点,采取最优解。

 

话不多说直接上代码先

import java.util.Scanner;

public class Warshall {
	public static void main(String[] args) {
		int [][] arrays = { {0,2,6,4},
							{100,0,3,100},
							{7,100,0,1},
							{5,100,12,0}};
		for(int i = 0 ; i < 4 ; i++) {
			for(int k = 0 ;k < 4;k++) {
				System.out.print(arrays[i][k]+"  ");
			}
		System.out.println();
		}
		for(int i = 0 ;i<4;i++) {
			for(int k = 0 ;k<4;k++) {
				if(arrays[i][k] > arrays[i][0] + arrays[0][k]) {
					arrays[i][k] = arrays[i][0] + arrays[0][k];
				}
			}
		}
		for(int i = 0 ;i<4;i++) {
			for(int k = 0 ;k<4;k++) {
				if(arrays[i][k] > arrays[i][1] + arrays[1][k]) {
					arrays[i][k] = arrays[i][1] + arrays[1][k];
				}
			}
		}
		for(int i = 0 ;i<4;i++) {
			for(int k = 0 ;k<4;k++) {
				if(arrays[i][k] > arrays[i][2] + arrays[2][k]) {
					arrays[i][k] = arrays[i][2] + arrays[2][k];
				}
			}
		}
		for(int i = 0 ;i<4;i++) {
			for(int k = 0 ;k<4;k++) {
				if(arrays[i][k] > arrays[i][3] + arrays[3][k]) {
					arrays[i][k] = arrays[i][3] + arrays[3][k];
				}
			}
		}
		for(int i = 0 ; i < 4 ; i++) {
			for(int k = 0 ;k < 4;k++) {
				System.out.print(arrays[i][k]+" ");
			}
		System.out.println();
		}
	}
}

可能你会感觉你不是说代码只有五行吗为啥那么多,这里我是为了展示他采取用到的思想,每次的执行的结果都是前面已经保证是最优解的情况来接续执行的。下面我就把他换成五行的代码。

for(int g = 0 ; g < 4; g++ ) {
		for(int i = 0 ;i<4;i++) {
			for(int k = 0 ;k<4;k++) {
				if(arrays[i][k] > arrays[i][g] + arrays[g][k]) {
					arrays[i][k] = arrays[i][g] + arrays[g][k];
				}
			}
		}
	}

 

好啦 介绍也就到此结束了 Thanks

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值