這位大哥真厲害,**講解dijkstra
根據他的講解,python實現如下
import math
class
graph
:def
__init__
(self,vexs,matrix)
: self.vexs = vexs
self.vexnum =
len(self.vexs)
self.matrix = matrix
class
shortestpath
:def
dijstra
(self,v,g:graph)
:#頂點個數
n = g.vexnum
#是否已處理
flag =[0
for i in
range
(g.vexnum)
]#路徑陣列
pre =[0
for i in
range
(g.vexnum)
]#距離
dist = g.matrix[v]
flag[v]=1
dist[v]=0
""" 開始n-1次迴圈
1. 找dist中未訪問的最小點k
2. 更新經過k點的最短路徑
"""for i in
range(1
,n):
_min = math.inf
# 1. 找dist中未訪問的最小點k
for j in
range
(n):
## 未訪問且最小的點k
ifnot flag[j]
and dist[j]
< _min:
_min = dist[j]
k = j
## 將k標記為已訪問
flag[k]=1
# 更新經過k點的最短路徑
for j in
range
(n):
#未訪問且經過k點的話dist會減小
ifnot flag[j]
and g.matrix[k]
[j]+ _min < dist[j]
:#更新到j的距離為到k的距離+k到j的距離
dist[j]
= g.matrix[k]
[j]+ _min
pre[j]
= k return pre, dist
vexs =[0
,1,2
,3]matrix =[[
0,2,
1,5]
,[2,
0,math.inf,1]
,[1,math.inf,0,
5],[
5,1,
5,0]
]g = graph(vexs,matrix)
s = shortestpath(
)pre, dist = s.dijstra(
2,g)
print
(pre,dist)
演算法 Dijkstra演算法筆記
參考文章 隨記參考邏輯 dijkstra演算法採用的是一種貪心的策略。演算法的基本思想是 通過不斷更新的距離陣列,每次從距離陣列找到離源點最近的乙個且沒有掃瞄過的節點,然後以該頂點為中心進行bfs擴充套件,直到所有節點都掃瞄一遍,最終得到源點到其餘所有點的最短路徑 1 起點固定,若要記錄到達路徑,則...
日日演算法 Dijkstra演算法
dijistra演算法作為一種最短路徑演算法,可以用來計算乙個節點到圖上其他節點的最短距離。主要是通過啟發式的思想,由中心節點層層向外拓展,直到找到中點。適用於無向圖和有向圖。假設我們要計算節點a到其它節點的最短距離 引入兩個集合 s,u 其中集合s表示已經求出最短路徑的點 以及最短距離 集合u表示...
(二)Dijkstra演算法
ifndef dijkstra define dijkstra include using namespace std void testdijstra const int max node 1000 最簡單的 用二維陣列來記錄graph和weight 斐波那契堆實現 insert,get 1.最普...