用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条边
- 三层for循环跑状态转移方程:O(n^3)
所以Floyd算法的时间复杂度为:O(n^3)