一、算法介绍 Floyd-Warshall算法 (英语: Floyd-Warshall algorithm),中文亦称 弗洛伊德算法 ,是解决任意两点间的 最短路径 的一种算法,可以正确处理 有向图 或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包。 Floyd-Warshall算法的 时间复杂度 为 O(N 3 ), 空间复杂度 为 O(N 2 )。 二、算法原理 Floyd-Warshall算法的原理是 动态规划 。 设 D i,j,k 为从 i 到 j 的只以 (1..k) 集合中的节点为中间节点的最短路径的长度。 若最短路径经过点 k,则 D i,j,k = D i,k,k-1 + D k,j,k-1 ; 若最短路径不经过点 k,则 D i,j,k =D i,j,k-1 。 因此, D i,j,k = min (D i,j,k-1 , D i,k,k-1 + D k,j,k-1 )。 1 for (k = 0; k < V; k++) { 2 for (i = 0; i < V; i++) { 3 for (j = 0; j < V; j++) { 4 if (dist[i][j] > dist[i][k] + dist[k][j]) { 5 dist[i][j] = dist[i][k] + dist[k][j]; 6 } 7 } 8 }