算法分析与设计实践-作业2-1-用Floyd算法解决最短路问题

用Floyd算法解决最短路问题

1.问题

用Floyd算法求解下图各个顶点的最短距离,并给出距离矩阵(顶点之间的最短距离矩阵)。

2.解析

设d[k,i,j]表示“经过若干给编号不超过k的节点”从i到j的最短路长度。该问题可划分为两个子问题,经过编号不超过k-1的节点从i到j,或者从i先到k再到j。
于是:d[k,i,j]=min(d[k-1,i,j],d[k-1,i,k]+d[k-1,k,j])

初值为d[0,i,j]=a[i,j],其中a为邻接矩阵。
可以发现,Floyd算法的本质为动态规划。k是阶段,所以必须置于最外层循环中。i和j是附加状态,所以应该置于内层循环。
其实,k这一维可以被省略。最初,我们可以用d数组保存邻接矩阵,然后执行动态规划的过程。当最外层循环到k时,内层有状态转移:
d[i,j]=min(d[i,j],d[i,k]+d[k,j]),
最终d[i,j]就保存了i到j的最短路长度。

3.设计

void Floyd(){
    
    
	for(k form 1 to n)
		for(i form 1 to n)
			for(j form 1 to n)
				d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}

4.分析

时间复杂度分析:设n个顶点,m条边

  1. 三层for循环跑状态转移方程:O(n^3)

所以Floyd算法的时间复杂度为:O(n^3)

5.源码

https://github.com/lu-225/As-before/blob/master/2018212212124%20%E9%99%86%E5%AE%B6%E8%BE%89%20%E5%AE%9E%E9%AA%8C2-1/Floyd.cpp

猜你喜欢

转载自blog.csdn.net/qq_43633353/article/details/104760965