迪傑斯特拉演算法 網上找的

2022-06-19 11:39:11 字數 2166 閱讀 3038

"""

輸入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)

print

(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開始帶其他節點的最短路徑

print

(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,這個向量儲存的是其他點的最短距離,初...