当前位置:首页 > 算法 > 正文内容

【算法】最短路径算法——Floyed-Warshell算法

亿万年的星光4年前 (2022-02-06)算法2324

如下图所示,我们把边带有权值的图称为带权图。

边的权值可以理解为两点之间的距离。一张图中任意两点间会有不同的路径相怜。最短路径就是指连接两点的这些路径中最短的一条。

【注意】边的权值可以为负。当出现负边权时,有些算法不适用。


Floyed-Warshall算法

    简称Floyed(弗洛伊德)算法,是最简单的最短路径算法,可以计算出图中任意两点间的最短路径。Floyed的时间复杂度是N3,适用于出现负边权的情况。

【算法描述】

(a)初始化:点u、v如果有边相怜,则dis[u][v]=w[u][v]

         如果不相连,则dis[u][v]=0x7fffffff( 即INT_MAX)

  (b) 

for(k=1;k<=n;k++)
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(dis[i][j]>dis[i][k]+dis[k][j]){
				dis[i][j]=dis[i][k]+dis[k][j] 
			}


(c)算法结束:dis[i][j]得出的就是从i到j的最短路径。


【算法分析】

三层循环,第一层循环中间点k,第二、第三层循环起点终点i,j,算法的思想很容易理解:如果点i到点k的距离加上点k到点j的距离小于原先点i到点j的距离,那么就用这个更短的路径长度来更新原先点i到点j的距离。

在上图中,因为dis[1][3]+dis[3][2]<dis[1][2],所以就用dis[1][3]+dis[3][2]来更新原先1到2的距离。

我们初始化时,把不相连的点之间的距离设为一个很大的数,不妨看作这两点相隔很远,如果两者之间有最短路径的话,就会更新成最短路径的长度。


【算法边形】

    如果是一个没有边的权的图,把相怜的两点间的距离设为dis[i][j]=true,不相连的两点设为dis[i][j]=false,用Floyed算法变形:

for(k=1;k<=n;k++)
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			dis[i][j]=dis[i][j]||(dis[i][k] && dis[k][j])


       

用这个方法可以判断一张图中的两点是否相连。

注意:用来循环中间点的变量k必须放在最外层一层循环。

扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【贪心】 导弹拦截

【贪心】 导弹拦截

【题目描述】某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来...

【算法】动态规划(一)

1.基本概念在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖...

【算法】滑动窗口1—窗口大小固定

【算法】滑动窗口1—窗口大小固定

一、定义滑动窗口算法(Sliding Window Algorithm)是一种用于解决数组或字符串中子数组或子串问题的优化技术。它通过维护一个窗口(通常是数组或字符串的一个连续子区间),在遍历过程中动...

【贪心】最大子矩阵

【题目描述】已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1X1)子矩阵。比如,如下4 x 4的矩阵0    -2&...

【算法】最小重量机器设计

【题目描述】设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设Wij 是 从供应商j处购得的部件i的重量,Cij 是相应的价格。 试设计一个算法,给出总价格不超...

【算法】高精度(2)

五、高精度处理进位与借位    其实也很简单,我们再来模拟一下,1439+887的时候,首先我们最低位相加,得到16,那么答案最低位就是6,再进个1,然后两数的十位相加,...