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

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

亿万年的星光3年前 (2022-02-06)算法1461

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

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

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


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.最优装载题目描述:有n个物体,第i个物体的重量为wi(wi为正整数)。选择尽量多的物体,使得总重量不超过C。【分析】由于只关心选择的物品的最大数量(而不是最大重量,最大重量需要考虑DP),所以装重...

【算法】广度优先搜索算法(BFS)

【算法】广度优先搜索算法(BFS)

一、广度优先搜索的过程    广度优先搜索算法(又称宽度优先搜索算法,BFS)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra...

【分治】----快速幂

【分治】----快速幂

1.幂幂(power)是指乘方运算的结果。n^m指该式意义为m个n相乘。把n^m看作乘方的结果,叫做n的m次幂,也叫n的m次方。2.幂的数学表示和规则23 * 24 =2734 * 34=383.分治...

【算法】二分法—最大化平均值问题简单总结

0.前言通过几道题目 切割钢管、木材加工、切割绳子、均分蛋糕 四道题,尝试了二分法中最大化平均值问题。然后,下面进行简单的对比和总结。1.简单总结while(l < ...

【贪心】----基本概念

一、基本概念所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪...

【排序】----选择排序

【排序】----选择排序

1.基本思想每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列最前,直到全部待排序的数据排完。2.过程首先初始化最小元素索引值为首元素。依次遍历待排序数列,遇到小于该最小索引...