程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

圖算法之dijkstra算法(python實現)

編輯:Python

以此圖為例:

代碼:

print("請輸入頂點個數")
vertex_num = int(input())
print("請輸入邊的條數")
edge_num = int(input())
print("請輸入源點")
start = int(input())
print("請依次輸入頂點之間路徑長度")
fmax = float('inf')
# 初始化鄰接矩陣
graph = [[fmax for _ in range(vertex_num)] for _ in range(vertex_num)]
# 初始化源點到各個點的距離數組
dist = [fmax for _ in range(vertex_num)]
# 初始化源點到各個點的路徑數組
path = [-1 for _ in range(vertex_num)]
# 用來存放已經確認最短距離的點
T = []
# 創建圖
for i in range(edge_num):
path_list = input().split(" ")
graph[int(path_list[0])][int(path_list[1])] = int(path_list[2])
def dijkstra(graph, s):
for i in range(vertex_num):
# 初始化dist數組
dist[i] = graph[s][i]
# 初始化path數組
if graph[s][i] < fmax:
path[i] = s
# 初始化頂點集
T.append(s)
while len(T) != vertex_num: # 如果頂點集T沒有滿,就一直循環
temp_num = fmax
for vertex in range(vertex_num):
if vertex not in T: # 如果頂點沒被加入到T中,表明從源點到該頂點的最短距離還沒確定
if dist[vertex] < temp_num:
temp_num = dist[vertex]
min_vertex = dist.index(temp_num)
if min_vertex in T: # 判斷取出的最短距離的點是不是之前已經確認了(針對有路徑相同的點)
min_vertex = dist.index(temp_num, min_vertex+1) # 如果確認了,就找下一個點
# 將確認了最短路徑的點,加入到頂點集
T.append(min_vertex)
# 找min_index的出度點
for i in range(vertex_num):
if graph[min_vertex][i] != fmax and i not in T:
if dist[i] > dist[min_vertex] + graph[min_vertex][i]:
dist[i] = dist[min_vertex] + graph[min_vertex][i]
path[i] = min_vertex
return dist, path
dist, path = dijkstra(graph, start)
print("源點到各個點的距離:", end=" ")
print(dist)
print("路徑:", end=" ")
print(path)
輸入:
請輸入頂點個數
5
請輸入邊的條數
6
請輸入源點
0
請依次輸入頂點之間路徑長度
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
輸出:
源點到各個點的距離: [inf, 1, 2, 1, 2]
路徑: [-1, 0, 0, 0, 3]

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved