一般情況下, dijkstra演算法是解決單源最短路徑問題的, 也就是在已知終點時, 求出圖中的每個點到終點的最短距離, 但是一般只記錄距離值, 不會記錄具體的路徑, 即怎麼走能從起點通過最短路徑來到達終點;
思路就是引入乙個path表, 其中path[x]表示, 如果從x節點要到達終點的最短路徑, 在x節點下一步應該怎麼走, 獲得這個path表之後, 我們只需要從起點回溯這個path表, 直到終點位置, 這樣就能找到從起點到終點的最短路徑了; 類似於下面這樣的操作:
nodes =
u = nf
while u!=nt:
u = path[u]
先放一段普通的dijkstra演算法的python實現
def
generatedisarray
(nf, nt, inf=
float
("inf"))
: dis =
dict
((k.getid(
),inf)
for k in net.getnodes())
heap =
# u is the next node to be relaxed
u = nf
dis[u]=0
[0, u]
)while
len(heap)
>0:
pid = p[1]
pdis = p[0]
if dis[pid]
< pdis :
continue
for x in adjacencylist[pid]
:if dis[x]
> dis[pid]
+adjacencylist[pid]
[x]:
dis[x]
= dis[pid]
+adjacencylist[pid]
[x]# 這裡的if判斷是為了處理一些沒有出度的點, 這些點不可能作為中間節點來鬆弛
if adjacencylist.__contains__(x)
==true
:[dis[x]
, x]
)if pid==nt:
print
("good luck!!!!"
)return dis
return dis;
這裡我加了乙個小剪枝, 因為我其實只希望找從節點nf到節點nt的最短路徑, 所以我第一次對nf節點做鬆弛操作的時候, 其實已經可以確定此時已經找到了到nf到nt的最短路了, 後面的迴圈都不需要了;
然後上改進之後的dijkstra演算法:
def
generatedisarray
(nf, nt, inf=
float
("inf"))
: dis =
dict
((k.getid(
),inf)
for k in net.getnodes())
path =
heap =
# u is the next node to be relaxed
u = nf
dis[u]=0
[0, u]
)while
len(heap)
>0:
pid = p[1]
pdis = p[0]
if dis[pid]
< pdis :
continue
for x in adjacencylist[pid]
:if dis[x]
> dis[pid]
+adjacencylist[pid]
[x]:
dis[x]
= dis[pid]
+adjacencylist[pid]
[x] path[x]
= pid
# 這裡的if判斷是為了處理一些沒有出度的點, 這些點不可能作為中間節點來鬆弛
if adjacencylist.__contains__(x)
==true
:[dis[x]
, x]
)if pid==nt:
print
("good luck!!!!"
)return dis, path
return dis, path;
dis = generatedisarray(nf, nt)
edges =
u = net.getnode(nt)
while u.getid(
)!=nf:
for e in u.getincoming():
if e.allows(newvehicletype)
==false
:continue
;#這裡的意思就是從當前節點到下一節點的消耗, 加上下一節點的dis值如果等於當前節點的dis值
#那麼就認為走這個節點是最優的路徑
if e.getlanes()[
0].getlength(
)+dis[e.getfromnode(
).getid()]
==dis[u.getid()]
:str
(e.getid())
) u = e.getfromnode(
)break
Dijkstra最優路徑的演算法
dijkstra最優路徑的演算法 最短路徑演算法 在日常生活中,我們如果需要常常往返a地區和b地區之間,我們最希望知道的可能是從a地區到b地區間的眾多路徑中,那一條路徑的路途最短。最短路徑問題是圖論研究中的乙個經典演算法問題,旨在尋找圖 由結點和路徑組成的 中兩結點之間的最短路徑。演算法具體的形式包...
最優路徑之 Dijkstra
求在乙個加權有向無環圖中,從起點到終點的最短路徑 圖中有四個節點,分別為 start,a,b,end 各個節點間的路徑長度如下 start a 6 start b 2 a end 1 b a 3 b end 5 終點 無 答案 最短路徑為 start b a end 6 usr bin env py...
題目 Dijkstra 列舉 路
時間限制 1 sec 記憶體限制 128 mb 題目描述 farmer john 熱衷於散步,每天早上他都要從 1 號倉庫走到 n 號倉庫。farmer john 家的 n 個倉庫被 m 條雙向道路連通起來,每條道路有乙個長度 w。而farmer john 又不喜歡走路,所以他走的是從 1 號倉庫到...