弗洛伊德(Floyd)算法可求解任意顶点间的最短路径。
在Floyd算法中,需要两个矩阵,一个是邻接矩阵A,最开始,A[i][j]的值为节点i到节点j的边的权值,如果i到j没有边,A[i][j]=,特别地,A[i][i]=0。另一个矩阵为P,P[i][j]的值为从i到j的路径上节点i的下一个节点,通过该矩阵可以找出任意节点i到节点j的最短路径。最开始,若i与相邻,则P[i][j]=j,否则P[i][j]=-1。
之后将对A和P进行n次迭代更新过程,n为节点个数,迭代更新原则是:
如果,那么
。
最终得到的A[i][j]就是i到j的最短路径长度,P[i][j]是i到j的最短路径上,i节点的下一个节点。
以下是Floyd算法的python代码
import numpy as np
def floyd_shortest_paths(graph):
vnum=graph.vertex_num()
a=[[graph.get_edge(i,j) for j in range(vnum)]\
for i in range(vnum)]
p=[[-1 if a[i][j]==np.inf else j for j in range(vnum)] \
for i in range(vnum)]
for k in range(vnum):
for i in range(vnum):
for j in range(vnum):
if a[i][j]>a[i][k]+a[k][j]:
a[i][j]=a[i][k]+a[k][j]
p[i][j]=p[i][k]
return (a,p)