貪心演算法 單源最短路徑問題

2021-09-26 10:19:34 字數 1794 閱讀 9611

尋找單源最短路問題:

給定帶權有向網路g=(v,e,w),每條邊e=的權w(e)為非負實數,表示i到j的距離,源點s

求從s出發到其他頂點的最短路徑short

#coding=utf-8

'''解:

short=儲存s到各個頂點的最短路徑,dist為s到各個頂點的當前路徑,

從dist中尋找最短路徑,並將其加入到short中,更新dist,然後再從dist中尋找最短路徑,加入short,更新dist,不斷迴圈,直到short中儲存有所用頂點的最短路徑

更新dist:

若剛才得到的最短路徑為(s,u),對於每個未取得最短路徑的頂點v,根據w[u,v]+short[u]?def

update_dict

(dict

, w, min_index,

min)

:for i in

range(1

,len

(w))

:if w[min_index]

[i]+

min<

dict[0

][i]

:dict[0

][i]

= w[min_index]

[i]+

minreturn

dict

defdijkstra

(s, w)

: n =

len(w)

inf =

1000

short = w[s]

dict

=[w[s],[

0for i in

range

(n)]

]#初始化dict, 第二行為0代表該點的最短路徑未求

dict[1

][0]

=1#起點到起點設short已知

for i in

range

(n-1):

min= inf

min_index =

0for j in

range

(n):

#尋找dict最小路徑

ifdict[1

][j]==0

anddict[0

][j]

<

min:

min=

dict[0

][j]

min_index = j

dict[1

][min_index]=1

short[min_index]

=min

dict

= update_dict(

dict

, w, min_index,

min)

return short

if __name__==

'__main__'

: inf =

1000

w =[[inf,

10, inf, inf, inf,3]

,[inf, inf,7,

5, inf, inf]

,[inf, inf, inf, inf, inf, inf],[

3, inf,

4, inf,

7, inf]

,[inf, inf, inf, inf, inf, inf]

,[inf,

2, inf,6,

1, inf]

]#有鄰接矩陣w

s =0#起點

short = dijkstra(s, w)

print

(short)

單源最短路徑 貪心演算法

乙個點 源點 到其餘各個頂點的最短路徑。也叫做 單源最短路徑 dijkstra。dijkstra的主要思想 每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終得到源點到其餘所有點的最短路徑 用flag標示該點是否在離源點最近的集合中 演算法步驟 1.初始時,s只包含源點,即p v的距...

貪心演算法 單源最短路徑 dijkstra

關於單源最短路徑的問題非常典型,這裡沒有給出分析與證明,僅僅給出了實現。需要指出的是,許多實現僅給出了最短路徑的長度,而沒有給出 最短路徑 這裡用給出了實現。如程式中那樣,定義乙個陣列p n 其中p i 代表 起始點v到頂點i的最短路徑中,除i本身的最後乙個頂點 即著這條路徑上i的前驅頂點,這個頂點...

貪心演算法 單源最短路徑 dijkstra

關於單源最短路徑的問題非常典型,這裡沒有給出分析與證明,僅僅給出了實現。需要指出的是,許多實現僅給出了最短路徑的長度,而沒有給出 最短路徑 這裡用給出了實現。如程式中那樣,定義乙個陣列p n 其中p i 代表 起始點v到頂點i的最短路徑中,除i本身的最後乙個頂點 即著這條路徑上i的前驅頂點,這個頂點...