Floyd算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,被用于计算图中任意两点间的距离。算法的时间复杂度为O(N3),空间复杂度为O(N2)。
算法思想
通俗的语言来描述,即首先我们的目标是寻找从点i到点j的最短路径,而从任意节点i到任意节点j的最短路径不外乎2种可能,要么直接从i到j,要么从i经过若干个节点k到j。因此,假设Dis(i,j)为节点u到节点v的最短路径的距离,然后依次取遍所有图中的点作为中间结点,检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立,证明 i—>k—>j 比i—>j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j)。如此,当遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。
举个简单例子:求下图中从点1到点8,点9,点10的最短距离。
具体算法(Python):
if __name__ == '__main__':
maxInt = 999999
data = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0],
[0, 5, 0, 0, 0, 0, 0, 0, 4, 0, 0],
[0, 7, 0, 0, 0, 0, 0, 0, 0, 12, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 12, 4, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 2],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0]]
path = []
for j in range(0, 11):
p = []
for i in range(0, 11):
p.append(-1)
if data[j][i] == 0:
data[j][i] = maxInt
path.append(p)
for v0 in range(1, 11):
for m in range(1, 11):
for k in range(1, 11):
if data[v0][m] > (data[v0][k] + data[k][m]):
data[v0][m] = data[v0][k] + data[k][m]
path[v0][m] = k
# print data[v0][m]
print data[1][8]
print data[1][9]
print data[1][10]