弗洛伊德(Floyd)算法是 Robert W. Floyd(罗伯特·弗洛伊德)于 1962 年发表在“Communications of the ACM”上,Robert W.Floyd 在 1978 年得到了图灵奖。用于从给定的加权图中查找全部顶点间的最短路径问题。做为该算法的结果,它将生成矩阵,该矩阵将表示从任何顶点到图中全部其余顶点的最小距离。java
1.根据输入图的二维数组初始化输出 dist 二维数组。
2.利用中间顶点,逐个挑选全部顶点并更新全部最短路径。
3.选择顶点 k 做为中间顶点时,咱们将顶点 {0,1,2,... k-1} 视为中间顶点,i、j 表示源顶点和目标顶点。
4.若是 k 不是从 i 到 j 的最短路径中的中间顶点,咱们保持 dist [i] [j]的值不变。
5.若是 k 是从 i 到 j 的最短路径中的中间顶点,而且 dist[i][k] + dist[k][j] < dist[i][j],则更新 dist[i][j] = dist[i][k] + dist[k][j]。算法
因为弗洛伊德算法使用了三层循环,因此它的时间复杂度为 ,空间复杂度为
。数组
public int[][] floydWarshall(int graph[][]) {
//顶点个数
int n = 4;
int dist[][] = new int[n][n];
int i, j, k;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
dist[i][j] = graph[i][j];
for (k = 0; k < n; k++) {
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if (dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
return dist;
}
复制代码
弗洛伊德算法的优势是容易理解,能够算出任意两个顶点之间的最短距离,代码编写简单。微信
缺点是时间复杂度比较高,不适合计算大量数据。spa
PS:
清山绿水始于尘,博学多识贵于勤。
我有酒,你有故事吗?
微信公众号:「清尘闲聊」。
欢迎一块儿谈天说地,聊代码。code