话不多说,直接上代码
import numpy as np
import networkx as nx
# floyd算法求两点vi与vj之间的最短路径长度以及最短路径经过的顶点序列
# 下列程序默认节点从0开始顺序编号,且vi<vj
def floyd(W, n, vi, vj):
U = W.copy()
m = 0
while m<n:
for i in range(n):
for j in range(n):
if U[i][j] > U[i][m] + U[m][j]:
U[i][j] = U[i][m] + U[m][j]
m += 1
# 求vi与vj之间最短路径经过的顶点序列
P1 = np.zeros(n)
k = 0
P1[k] = vj
kk = vj
V = np.ones(n)*np.inf
while kk != vi:
for i in range(n):
V[i] = U[vi][kk] - W[i][kk]
if V[i] == U[vi][i]:
P1[k+1] = i
kk = i
k += 1
path = [] # vi与vj之间最短路径经过的顶点序列
wrow = np.nonzero(P1)[0]
# 如果初始节点编号是0
if vi == 0:
path.append(vi)
for i in np.arange(len(wrow)-1,-1,-1):
path.append(int(P1[wrow[i]]))
return U[vi][vj], path
if __name__ == '__main__':
# 无向加权图
G = nx.Graph()
nodes = [0,1,2,3,4,5,6,7]
edge_list = [(0,1,2),(0,2,8),(0,3,1),(1,2,6),
(1, 4, 1), (2, 3, 7), (2, 4, 5), (2, 5, 1),
(2,6,2),(3,6,9),(4,5,3),(4,7,8),
(5,6,4),(5,7,6),(6,7,3)]
G.add_nodes_from(nodes)
G.add_weighted_edges_from(edge_list)
# 获取无向图的加权邻接矩阵
As = nx.adjacency_matrix(G)
A = np.array(As.todense())
n = np.shape(A)[0]
W = A.astype(np.float64)
for i in range(n):
for j in range(n):
if i!=j and W[i][j] == 0:
W[i][j] = np.inf
vi, vj = 0, 7
dij, path_ij = floyd(W, n, vi, vj)
print("节点{}和{}之间的最短路径为{},其长度为{}".format(vi, vj, path_ij, dij))
vi, vj = 1, 6
dij, path_ij = floyd(W, n, vi, vj)
print("节点{}和{}之间的最短路径为{},其长度为{}".format(vi, vj, path_ij, dij))
vi, vj = 0, 6
dij, path_ij = floyd(W, n, vi, vj)
print("节点{}和{}之间的最短路径为{},其长度为{}".format(vi, vj, path_ij, dij))