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 簡...