Floyd-Warshall 算法:获取最短路径
Floyd-Warshall algorithm: get the shortest paths
假设一个图由 n x n
维邻接矩阵表示。我知道如何获得所有对的最短路径矩阵。但我想知道有没有办法追踪所有最短路径?
Blow是python代码实现。
v = len(graph)
for k in range(0,v):
for i in range(0,v):
for j in range(0,v):
if graph[i,j] > graph[i,k] + graph[k,j]:
graph[i,j] = graph[i,k] + graph[k,j]
您必须在您的 if 语句中添加一个新矩阵来存储路径重建数据(数组 p
是前置矩阵):
if graph[i,j] > graph[i,k] + graph[k,j]:
graph[i,j] = graph[i,k] + graph[k,j]
p[i,j] = p[k,j]
开始时,矩阵 p
必须填写为:
for i in range(0,v):
for j in range(0,v):
p[i,j] = i
if (i != j and graph[i,j] == 0):
p[i,j] = -30000 # any big negative number to show no arc (F-W does not work with negative weights)
要重建 i
和 j
节点之间的路径,您必须调用:
def ConstructPath(p, i, j):
i,j = int(i), int(j)
if(i==j):
print (i,)
elif(p[i,j] == -30000):
print (i,'-',j)
else:
ConstructPath(p, i, p[i,j]);
print(j,)
以及具有以上功能的测试:
import numpy as np
graph = np.array([[0,10,20,30,0,0],[0,0,0,0,0,7],[0,0,0,0,0,5],[0,0,0,0,10,0],[2,0,0,0,0,4],[0,5,7,0,6,0]])
v = len(graph)
# path reconstruction matrix
p = np.zeros(graph.shape)
for i in range(0,v):
for j in range(0,v):
p[i,j] = i
if (i != j and graph[i,j] == 0):
p[i,j] = -30000
graph[i,j] = 30000 # set zeros to any large number which is bigger then the longest way
for k in range(0,v):
for i in range(0,v):
for j in range(0,v):
if graph[i,j] > graph[i,k] + graph[k,j]:
graph[i,j] = graph[i,k] + graph[k,j]
p[i,j] = p[k,j]
# show p matrix
print(p)
# reconstruct the path from 0 to 4
ConstructPath(p,0,4)
输出:
p:
[[ 0. 0. 0. 0. 5. 1.]
[ 4. 1. 5. 0. 5. 1.]
[ 4. 5. 2. 0. 5. 2.]
[ 4. 5. 5. 3. 3. 4.]
[ 4. 5. 5. 0. 4. 4.]
[ 4. 5. 5. 0. 5. 5.]]
路径 0-4:
0
1
5
4
假设一个图由 n x n
维邻接矩阵表示。我知道如何获得所有对的最短路径矩阵。但我想知道有没有办法追踪所有最短路径?
Blow是python代码实现。
v = len(graph)
for k in range(0,v):
for i in range(0,v):
for j in range(0,v):
if graph[i,j] > graph[i,k] + graph[k,j]:
graph[i,j] = graph[i,k] + graph[k,j]
您必须在您的 if 语句中添加一个新矩阵来存储路径重建数据(数组 p
是前置矩阵):
if graph[i,j] > graph[i,k] + graph[k,j]:
graph[i,j] = graph[i,k] + graph[k,j]
p[i,j] = p[k,j]
开始时,矩阵 p
必须填写为:
for i in range(0,v):
for j in range(0,v):
p[i,j] = i
if (i != j and graph[i,j] == 0):
p[i,j] = -30000 # any big negative number to show no arc (F-W does not work with negative weights)
要重建 i
和 j
节点之间的路径,您必须调用:
def ConstructPath(p, i, j):
i,j = int(i), int(j)
if(i==j):
print (i,)
elif(p[i,j] == -30000):
print (i,'-',j)
else:
ConstructPath(p, i, p[i,j]);
print(j,)
以及具有以上功能的测试:
import numpy as np
graph = np.array([[0,10,20,30,0,0],[0,0,0,0,0,7],[0,0,0,0,0,5],[0,0,0,0,10,0],[2,0,0,0,0,4],[0,5,7,0,6,0]])
v = len(graph)
# path reconstruction matrix
p = np.zeros(graph.shape)
for i in range(0,v):
for j in range(0,v):
p[i,j] = i
if (i != j and graph[i,j] == 0):
p[i,j] = -30000
graph[i,j] = 30000 # set zeros to any large number which is bigger then the longest way
for k in range(0,v):
for i in range(0,v):
for j in range(0,v):
if graph[i,j] > graph[i,k] + graph[k,j]:
graph[i,j] = graph[i,k] + graph[k,j]
p[i,j] = p[k,j]
# show p matrix
print(p)
# reconstruct the path from 0 to 4
ConstructPath(p,0,4)
输出:
p:
[[ 0. 0. 0. 0. 5. 1.]
[ 4. 1. 5. 0. 5. 1.]
[ 4. 5. 2. 0. 5. 2.]
[ 4. 5. 5. 3. 3. 4.]
[ 4. 5. 5. 0. 4. 4.]
[ 4. 5. 5. 0. 5. 5.]]
路径 0-4:
0
1
5
4