Python實現Dijkstra演算法

2022-09-28 06:03:11 字數 2126 閱讀 8899

dijkstra演算法

迪傑斯特拉演算法是由荷蘭計算機科學家狄克斯特拉於1959 年提出的,因此又叫狄克斯特拉演算法。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向圖中最短路徑問題。迪傑斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。

迪傑斯特拉演算法是求從某乙個起點到其餘所有結點的最短路徑,是一對多的對映關係,是一種貪婪演算法

示例:演算法

演算法實現流程思路:

迪傑斯特拉演算法每次只找離起點最近的乙個結點,並將之併入已經訪問過結點的集合(以防重複訪問,陷入死迴圈),然後將剛找到的最短路徑的結點作為中間結點來更新相鄰結點的路徑長度,這樣迴圈找到圖中乙個個結點的最短路徑。

"""輸入graph 輸入的圖

src 原點

返回dis 記錄源點到其他點的最短距離

path 路徑

"""import json

def dijkstra(graph,src):

if graph ==none:

return none

# 定點集合

nodes = [i for i in range(len(graph))] # 獲取頂點列表,用鄰接矩陣儲存圖

# 頂點是否被訪問

程式設計客棧 visited =

visited.append(src)

# 初始化dis

dis = # 源點到自身的距離www.cppcns.com為0

for i in nodwww.cppcns.comes:

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=dpre=v

if k!=src and temp_k==k:

break

dis[k]=mid_distance # 最短路徑

fjholxqp path[src][k]=[i for i in path[src][pre]]

path[src][k].append(k)

visited.append(k)

nodes.remove(k)

print(nodes)

return dis,path

if __name__ == '__main__':

# 輸入的有向圖,有邊儲存的就是邊的權值,無邊就是float('inf'),頂點到自身就是0

grfjholxqpaph = [

[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))

總結

二維陣列和vector實現dijkstra

關於迪傑斯特拉演算法 通俗的來講就是每次從起點 確定 唯一 選一條到終點 此處終點是廣義的終點不是題目所給出詢問的終點 最短的路 dist i dist i 是一邊使用 一邊修改的注意!將該終點作為行營,依次向外擴充套件,更新從起點到這點的最短路。二維陣列 對於行營接觸不到的點本來是想更新的,但由於...

51Nod 1459 迷宮遊戲(dijkstra)

一道最短路問題,我是稍微變形一下dijkstra來做的 這道題不僅要求最短路,還要求最短路節點和的最大值。這裡有乙個坑點就是存在多條最短路的時候要輸出最短路徑上節點和最大值 還有乙個坑點就是這是乙個無向圖那麼如果存在a b的話那麼b a也是可以的 ps 這是蒻的第一道最短路,用的是priority ...

51Nod 1459 迷宮遊戲(Dijkstra)

題目鏈結 你來到乙個迷宮前。該迷宮由若干個房間組成,每個房間都有乙個得分,第一次進入這個房間,你就可以得到這個分數。還有若干雙向道路鏈結這些房間,你沿著這些道路從乙個房間走到另外乙個房間需要一些時間。遊戲規定了你的起點和終點房間,你首要目標是從起點盡快到達終點,在滿足首要目標的前提下,使得你的得分總...