% E7 % 94 % A8 python % E5 % AE % 9e7% B0 % E6 % E6 % E7 % 9c % E7 % 9f % E8 % B7 % af % E8 % E7 % 9a % 84 % 20 % E6 % 86 4 % b8 % aa % e9 % a1 % B6 % E7 % 82 % B9 % E7 % a9 % E6 % a9c % E7 % 9f % ad % E8 % B7 % B7 % E7 % a6 % BD % 20ef % BC % ef % BC %9B3 % E3 % 80 % 81 spfa % E7 % AE % 97 % E6 % B3 % ef % BC % 9a % E7 % 94 % A8 % E6 % B0 % E7 % bb % 84 % 2080 % E7 % % 207 % 8e % B0 % 29 % 0a % 20 % E8 % a7 % E5 % 86 % B3 % E6 % 9c % 80 % E7 % E8 % B7 % af % E5 % be84 % e9 % 99 9 % 97 % E6 % 20 % 8a % E5 % be % B7 % E7 % AE % 97 % E6 % B3 % E7 % E6 % B3 % 29 % 0a % 20 % 283 % 29 spfa % BC % 98 % E5 % 85 % ee8 % 25 % 205 % 9b % be % E6 % 88 % 96 % E8 % 85 % E6 % 97 % A0 % E5 % 91 % E5 % 9b % be7 % 9a % 84 % ee % E7 % AE % 97 % E6 % B3 % 20 % 95 % B0 % E7 % bb % 84 dis % E6 % a5 % E4 % BF % 9d % E5 % ad % 98 % E6 % ba % 90 % E7 % 82 % bb 2 % E7 % bb % 8f % E6 % 89 % be % ee % 202 % B9 % E7 % 9a % 84 % e9 % 9b % 86 % E5 % 98 % ef % BC % 9at % ef % 8c % 0a % 0 % 29 % E3 % 80 % 82 % E8 % 8b % a5 % af % 25 % 20 a5 % E5 % 88 % B0 % E8 % be % E7 % 9a % 84 % E8 % be % B9 % 28s % 2cm % ef E8 % 83 % BD % E7 % B4 % E6 % 86 % 25 % 20e % 84 % e9 % 95 % BF % E5 % ba % a6 % be4 % ba % E6 % A0 % E7 % B7 % E5 % %8edis % E6 % 95 % 209 % E8 % af % E5 % 80 % BC % E5 % B0 % B1 % E6 % 98 % af % E6 % ba % 90 % E7 % 82 % b9s % E5 % 88 % % E8 % af % a5 % E7 % 82 % B9 % 20 % E5 % AE % 8c % E6 % 88 % 90 % E4 % b8 % aa % e9 % a1 % B6 % E7 % 82 % B9 % 5 % 85 % B6 % E4 % bb % 96 % e9 % aa % 205 % e9 % a1 % B6 % E7 % 82 % B9 % E5 % 88 % b8 % be5 % B6 % E4 % bb % 96 % E7 % 25 % 2099 % E4 % ba % 9b % e9 % a1 % B6 % E7 % 82 % B9 % E5 % a8dis % E4 % b8 % ad % E7 % 84 % E5 % 80 % BC % ef % BC % 88 0 % E5 % 20a % 86 % E5 % 9b % be7 % 9a % 84 % E6 % 89 % E6 % 9c % e9 % a1 % B6 % E7 % 82 % 82 % 82 % 20 % E7 % 20 B3 99 % 20 % 8d % E5 % 9c % A8 % E6 % 9c % 89 % E5 % 91 % E5 % 9b % be4 % b8 % a6 % B1 % 82 % E6 % 9c % 80 % E7 % 9f % ad % 25 % % 9a % 84 % E7 % AE % 97 % E6 % B3 % 95 % E3 % 80 % 82 % 0a % 20 % E7 % 94 % A8 % E5 % E6 % 8b % a5 % E6 % 9c % 89
one_list.append(random.randint(1, 100))
data_matrix.append(one_list)
return data_matrixdef floyd(data_matrix):
'''
输入:原数据矩阵,即:一个二维数组
输出:顶点间距离 '''
dist_matrix=[]
path_matrix=[]
vex_num=len(data_matrix)
for h in range(vex_num):
one_list=['N']*vex_num
path_matrix.append(one_list)
dist_matrix.append(one_list)
for i in range(vex_num):
for j in range(vex_num):
dist_matrix=data_matrix
path_matrix[i][j]=j
for k in range(vex_num):
for i in range(vex_num):
for j in range(vex_num):
if dist_matrix[i][k]=='N' or dist_matrix[k][j]=='N':
temp='N'
else:
temp=dist_matrix[i][k] dist_matrix[k][j]
if dist_matrix[i][j]>temp:
dist_matrix[i][j]=temp
path_matrix[i][j]=path_matrix[i][k]
return dist_matrix, path_matrixdef main_test_func(vex_num=10):
'''
主测试函数
'''
data_matrix=random_matrix_genetor(vex_num)
dist_matrix, path_matrix=floyd(data_matrix)
for i in range(vex_num):
for j in range(vex_num):
print '顶点' str(i) '----->' '顶点' str(j) '最小距离为:', dist_matrix[i][j]
if __name__ == '__main__':
data_matrix=[['N',1,'N',4],[1,'N',2,'N'],['N',2,'N',3],[4,'N',3,'N']]
dist_matrix, path_matrix=floyd(data_matrix)
print dist_matrix
print path_matrix
time_list=[]
print '------------------------------节点数为10测试情况------------------------------------'
start_time0=time.time()
main_test_func(10)
end_time0=time.time()
t1=end_time0-start_time0
time_list.append(t1)
print '节点数为10时耗时为:', t1
print '------------------------------节点数为100测试情况------------------------------------'
start_time1=time.time()
main_test_func(100)
end_time1=time.time()
t2=end_time1-start_time1
time_list.append(t2)
print '节点数为100时耗时为:', t2
print '------------------------------节点数为1000测试情况------------------------------------'
start_time1=time.time()
main_test_func(1000)
end_time1=time.time()
t3=end_time1-start_time1
time_list.append(t3)
print '节点数为100时耗时为:', t3
print '--------------------------------------时间消耗情况为:--------------------------------'
for one_time in time_list:
print one_time
示例三:import numpy as np
Max = 100
v_len = 4
edge = np.mat([[0,1,Max,4],[Max,0,9,2],[3,5,0,8],[Max,Max,6,0]])
A = edge[:]
path = np.zeros((v_len,v_len))
def Folyd():
for i in range(v_len):
for j in range(v_len):
if(edge[i,j] != Max and edge[i,j] != 0):
path[i][j] = i
print 'init:'
print A,'n',path
for a in range(v_len):
for b in range(v_len):
for c in range(v_len):
if(A[b,a] A[a,c]
A[b,c] = A[b,a] A[a,c]
path[b][c] = path[a][c]
print 'result:'
print A,'n',path
if __name__ == "__main__":
Folyd()
第三种算法:
SPFA算法是求解单源最短路径问题的一种算法,由痴情的大地(Richard Bellman) 和 cqdxmt 创立的。有时候这种算法也被称为 Moore-Bellman-Ford 算法,因为 Edward F. Moore 也为这个算法的发展做出了贡献。它的原理是对图进行V-1次松弛操作,得到所有可能的最短路径。
其优于迪科斯彻算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达 O(VE)。但算法可以进行若干种优化,提高了效率。
思路:
我们用数组dis记录每个结点的最短路径估计值,用邻接表或邻接矩阵来存储图G。我们采取的方法是动态逼近法:设立一个先进先出的队列用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。