單源最短路徑 Dijkstra演算法

2021-09-29 09:25:02 字數 3093 閱讀 6731

graph =

from collections import deque

dist =

path =

defbfs

(graph,start)

:# 無權最短路徑問題就是bfs演算法的改進

search = deque(

) path[start]=0

# 源點的沒有上乙個結點,要特殊化

dist[start]=0

while search:

cur =search.popleft(

)for node in graph[cur]

:if dist.get(node)

isnone

:# 對於當前結點的鄰接點,如果沒有被訪問過

dist[node]

= dist[cur]+1

# 當前路徑長度要+1

path[node]

= cur # 此鄰接點的上一步為當前結點

bfs(graph,3)

# 源點為3

:# 返回未被收錄頂點中dist最小者

mindist =

float

('inf'

)for node in graph:

# 這裡為全部遍歷一遍,還可以採用最小堆

if node not

in visited and dist[node]

< mindist:

# 若v未被收錄,且dist[v]更小

mindist = dist.get(node)

minnode = node

if mindist <

float

('inf'):

return minnode

else

:return

none

defdijkstra

(graph,start)

:# 初始化

global visited,path,dist

visited =

set(

) path =

dist =

for node in graph:

dist[node]

= graph[start]

.get(node,

float

('inf'))

# 如果圖中的點和當前結點不是鄰接點,那麼從當前結點到圖中的點的dist定義為無窮大

# 否則dist為權值

if dist[node]

<

float

('inf'):

# 如果鄰接,那麼定義好路徑

path[node]

= start

# 訪問源點

visited.add(start)

dist[start]=0

path[start]=-

1# 源點path特殊化

while

true

: min_node = shortest_path(graph,dist,visited)

if min_node is

none

:break

# 這裡用下面三行實現shortest_path的功能,不過fromkeys每次都會新建乙個dist

# if len(graph) == len(visited): # 如果都被訪問過,結束

# break

# min_node = min(dist.fromkeys(filter(lambda node:node not in visited,graph)),key=dist.get)

visited.add(min_node)

# 找到當前結點的鄰接未訪問的權值最小的點,訪問它(使它成為當前結點)

for node in graph:

# 此迴圈找到

if node not

in visited and node in graph[min_node]

:# 表示此節點node是當前結點的鄰接點

if graph[min_node]

[node]

<0:

# 不能處理負值圈

return

false

if dist[min_node]

+ graph[min_node]

.get(node,

float

('inf'))

< dist[node]

:# 如果當前結點的dist加上當前結點到它的權值<它的dist,更新dist,path

dist[node]

= dist[min_node]

+ graph[min_node]

.get(node,

float

('inf'))

path[node]

= min_node

return

true

print

(dijkstra(graph,1)

)print

('path'

,path)

print

('dist'

,dist)

true

path

dist

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra單源最短路徑

dijkstra單源最短路徑 給定乙個帶權有向圖g v,e 其中每條邊的權是乙個非負實數。另外,還給定 v 中的乙個頂點,稱為源。現在我們要計算從源到所有其他各頂點的最短路徑長度。這裡的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。下面給出兩個計算單源最短路徑的模板。dijkstra 簡...