Skiena 的算法书包含以下对Floyd Warshall 算法的解释:
floyd(adjacency_matrix *g)
{
int i,j; /* dimension counters */
int k; /* intermediate vertex counter */
int through_k; /* distance through vertex k */
for (k=1; k<=g->nvertices; k++)
for (i=1; i<=g->nvertices; i++)
for (j=1; j<=g->nvertices; j++) {
through_k = g->weight[i][k]+g->weight[k][j];
if (through_k < g->weight[i][j])
g->weight[i][j] = through_k;
}
}
Floyd-Warshall 全对最短路径在 O(n 3 ) 时间内运行,这在渐近上并不比对 Dijkstra 算法的 n 次调用更好。但是,循环非常紧凑,程序非常短,以至于它在实践中运行得更好。值得注意的是,它是一种罕见的图算法,它在邻接矩阵上比邻接列表工作得更好。
有人可以详细说明为什么粗体部分是真的吗?