尋找單源最短路問題:
給定帶權有向網路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的前驅頂點,這個頂點...