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 ) 時間で実行されます。これは、漸近的に、ダイクストラのアルゴリズムへの n 回の呼び出しよりも優れていません。ただし、ループは非常にタイトで、プログラムは非常に短いため、実際にはより適切に実行されます。これは、隣接リストよりも隣接行列でうまく機能するまれなグラフ アルゴリズムの 1 つとして注目に値します。
太字の部分が真である理由を誰か詳しく説明してもらえますか?