"""輸入graph 輸入的圖
src 原點
返回dis 記錄源點到其他點的最短距離
path 路徑
"""import
json
defdijkstra(graph, src):
if graph ==none:
return
none
#定點集合
nodes = [i for i in range(len(graph))] #
獲取頂點列表,用鄰接矩陣儲存圖
#頂點是否被訪問
visited =
#初始化dis
dis = #
源點到自身的距離為0
for i in
nodes:
dis[i] =graph[src][i]
path = } #
記錄源節點到每個節點的路徑
k = pre =src
while
nodes:
temp_k =k
mid_distance = float('
inf') #
設定中間距離無窮大
for v in
visited:
for d in
nodes:
if graph[src][v] != float('
inf') and graph[v][d] != float('
inf'): #
有邊 new_distance = graph[src][v] +graph[v][d]
if new_distance <=mid_distance:
mid_distance =new_distance
graph[src][d] = new_distance #
進行距離更新
k =d
pre =v
if k != src and temp_k ==k:
break
dis[k] = mid_distance #
最短路徑
path[src][k] = [i for i in
path[src][pre]]
nodes.remove(k)
(nodes)
return
dis, path
if__name__ == '
__main__':
#輸入的有向圖,有邊儲存的就是邊的權值,無邊就是float('inf'),頂點到自身就是0
graph =[
[0, float(
'inf
'), 10, float('
inf'), 30, 100],
[float(
'inf
'), 0, 5, float('
inf'), float('
inf'), float('
inf'
)], [float(
'inf
'), float('
inf'), 0, 50, float('
inf'), float('
inf'
)], [float(
'inf
'), float('
inf'), float('
inf'), 0, float('
inf'), 10],
[float(
'inf
'), float('
inf'), float('
inf'), 20, 0, 60],
[float(
'inf
'), float('
inf'), float('
inf'), float('
inf'), float('
inf'
), 0]]
dis, path = dijkstra(graph, 0) #
查詢從源點0開始帶其他節點的最短路徑
(dis)
print(json.dumps(path, indent=4))
2020-05-08
迪傑斯特拉演算法
if object id t test is not null drop table t test gocreate table dbo t test id int identity 1,1 not null primary key,自增字段,無意義 header varchar 500 第一點的名...
迪傑斯特拉演算法
dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...
迪傑斯特拉演算法
迪傑斯特拉演算法用來計算圖中某一點到其他點的最短距離,這個圖可以是加權,也可以是無權的,距離指的是從一點到其它點所經過的邊的權重和 假設現在有乙個加權無向圖,我們要求節點1到其他點的最短距離 初始化圖arr 用乙個鄰接矩陣來表示一張圖,矩陣元素 初始化一維向量d,這個向量儲存的是其他點的最短距離,初...