下面是用Python实现Floyd算法的代码,供大家参考,具体内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
# -*- coding: utf-8 -*- """ Created on Thu Jul 13 14:56:37 2017 @author: linzr """ ## 表示无穷大 INF_val = 9999 class Floyd_Path(): def __init__( self , node, node_map, path_map): self .node = node self .node_map = node_map self .node_length = len (node_map) self .path_map = path_map self ._init_Floyd() def __call__( self , from_node, to_node): self .from_node = from_node self .to_node = to_node return self ._format_path() def _init_Floyd( self ): for k in range ( self .node_length): for i in range ( self .node_length): for j in range ( self .node_length): tmp = self .node_map[i][k] + self .node_map[k][j] if self .node_map[i][j] > tmp: self .node_map[i][j] = tmp self .path_map[i][j] = self .path_map[i][k] print '_init_Floyd is end' def _format_path( self ): node_list = [] temp_node = self .from_node obj_node = self .to_node print ( "the shortest path is: %d" ) % ( self .node_map[temp_node][obj_node]) node_list.append( self .node[temp_node]) while True : node_list.append( self .node[ self .path_map[temp_node][obj_node]]) temp_node = self .path_map[temp_node][obj_node] if temp_node = = obj_node: break ; return node_list def set_node_map(node_map, node, node_list, path_map): for i in range ( len (node)): ## 对角线为0 node_map[i][i] = 0 for x, y, val in node_list: node_map[node.index(x)][node.index(y)] = node_map[node.index(y)][node.index(x)] = val path_map[node.index(x)][node.index(y)] = node.index(y) path_map[node.index(y)][node.index(x)] = node.index(x) if __name__ = = "__main__" : node = [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' ] node_list = [( 'A' , 'F' , 9 ), ( 'A' , 'B' , 10 ), ( 'A' , 'G' , 15 ), ( 'B' , 'F' , 2 ), ( 'G' , 'F' , 3 ), ( 'G' , 'E' , 12 ), ( 'G' , 'C' , 10 ), ( 'C' , 'E' , 1 ), ( 'E' , 'D' , 7 )] ## node_map[i][j] 存储i到j的最短距离 node_map = [[INF_val for val in xrange ( len (node))] for val in xrange ( len (node))] ## path_map[i][j]=j 表示i到j的最短路径是经过顶点j path_map = [[ 0 for val in xrange ( len (node))] for val in xrange ( len (node))] ## set node_map set_node_map(node_map, node, node_list, path_map) ## select one node to obj node, e.g. A --> D(node[0] --> node[3]) from_node = node.index( 'A' ) to_node = node.index( 'E' ) Floydpath = Floyd_Path(node, node_map, path_map) path = Floydpath(from_node, to_node) print path |
运行结果为:
the shortest path is: 23
['A', 'F', 'G', 'C', 'E']
原文链接:http://blog.csdn.net/u011285477/article/details/75096303