图搜索之基于Python的迪杰斯特拉算法和弗洛伊德算法,供大家参考,具体内容如下
Djstela算法
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
|
#encoding=UTF-8 MAX = 9 ''' Created on 2016年9月28日 @author: sx ''' b = 999 G = [[ 0 , 1 , 5 ,b,b,b,b,b,b],\ [ 1 , 0 , 3 , 7 , 5 ,b,b,b,b],\ [ 5 , 3 , 0 ,b, 1 , 7 ,b,b,b],\ [b, 7 ,b, 0 , 2 ,b, 3 ,b,b],\ [b, 5 , 1 , 2 , 0 , 3 , 6 , 9 ,b],\ [b,b, 7 ,b, 3 , 0 ,b, 5 ,b],\ [b,b,b, 3 , 6 ,b, 0 , 2 , 7 ],\ [b,b,b,b, 9 , 5 , 2 , 0 , 4 ],\ [b,b,b,b,b,b, 7 , 4 , 0 ]] P = [] D = [] def Djstela(G,P,D): final = [] for i in range ( 0 , len (G)): final.append( 0 ) D.append(G[ 0 ][i]) P.append( 0 ) D[ 0 ] = 0 final[ 0 ] = 1 k = 0 for v in range ( 1 , len (G)): min = 999 for w in range ( 0 , len (G)): if final[w] = = 0 and D[w]< min : k = w min = D[w] final[k] = 1 for t in range ( 0 , len (G)): if min + G[k][t]<D[t]: D[t] = min + G[k][t] P[t] = k print ( "\n最短路径\n" ,D, "\n" , "\n前一个选择\n" ,P) def search(x): print ( "选择的终点" ,x, "最短路径" ,D[x]) print ( "邻接矩阵\n" ) for i in range ( 0 , 9 ): print (G[i]) Djstela(G, P, D) q = input ( "\n请输入终点" ) search( int (q)) |
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
|
#encoding=UTF-8 ''' Created on 2016年9月28日 @author: sx ''' t = 0 b = 999 G = [[ 0 , 1 , 5 ,b,b,b,b,b,b],\ [ 1 , 0 , 3 , 7 , 5 ,b,b,b,b],\ [ 5 , 3 , 0 ,b, 1 , 7 ,b,b,b],\ [b, 7 ,b, 0 , 2 ,b, 3 ,b,b],\ [b, 5 , 1 , 2 , 0 , 3 , 6 , 9 ,b],\ [b,b, 7 ,b, 3 , 0 ,b, 5 ,b],\ [b,b,b, 3 , 6 ,b, 0 , 2 , 7 ],\ [b,b,b,b, 9 , 5 , 2 , 0 , 4 ],\ [b,b,b,b,b,b, 7 , 4 , 0 ]] P = [[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],\ [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],\ [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ]] D = [[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],\ [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],\ [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ],[ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ]] def Floyd(G,P,D): t = 0 for u in range ( 0 , len (G)): for s in range ( 0 , len (G)): D[u][s] = G[u][s] P[u][s] = s for k in range ( 0 , len (G)): for v in range ( 0 , len (G)): for w in range ( 0 , len (G)): if D[v][w]>D[v][k] + D[k][w]: t = t + 1 D[v][w] = D[v][k] + D[k][w] P[v][w] = P[v][k] Floyd(G, P, D) def search(s,u): lenth = D[s][u] print ( "路径长度为" ,lenth) f = P[s][u] foot = [s,f] if f = = u: print ( "无需规划,0步" ) while f! = u: f = P[f][u] foot.append(f) for i in range ( 0 , len (foot)): if i = = 0 : print ( "起 点____" ,foot[i]) elif i = = len (foot) - 1 : print ( "终 点____" ,foot[i], "步长___" ,G[foot[i - 1 ]][foot[i]]) else : print ( "第" ,i, "点____" ,foot[i], "步长___" ,G[foot[i - 1 ]][foot[i]]) print ( "邻接矩阵" ) for i in range ( 0 , 9 ): print (G[i]) s = input ( "请输入起点0-8\n" ) u = input ( "请输入终点0-8\n" ) Floyd(G, P, D) search( int (s), int (u)) |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/sinat_33829806/article/details/54487424