1. 问题
用Floyd算法求解下图各个顶点的最短距离,给出距离矩阵
2. 解析
(1)任意节点i到任意节点j的距离可能是:①i到j的直接距离;②i经过k1、k2···kn后到j的距离;
(2)假设D[i][j]存储的是点i到j的最短距离,对kn判断D[i][kn]+D[kn][j]是否小于D[i][j];
(3)若D[i][kn]+D[kn][j]<D[i][j],则更新D[i][j]的值为D[i][kn]+D[kn][j];
(4)遍历完所有k后,D[i][j]就是最短距离矩阵
3. 设计
void Floyd( ) {
int i, j, k;
for (k = 1; k <= Vnum; k++) {
for (i = 1; i <= Vnum; i++) {
for (j = 1; j <= Vnum; j++) {
if (D[i][j] > D[i][k] + D[k][j])
D[i][j] = D[i][k] + D[k][j];
}
}
}
}
4. 分析
Floyd算法的主体是三层嵌套的循环,所以时间复杂度为O(n^3)
5. 源码
https://github.com/tangsongbbb/AlgorithmsLearning/blob/master/作业二/2.1.c