dijkstra是解決單源最短路徑的一般方法,屬於一種貪婪演算法。
所謂單源最短路徑是指在乙個賦權有向圖中,從某一點出發,到另一點的最短路徑。
以python**為例,實現dijkstra演算法
1、資料結構設計
假設圖以單邊列表的方式進行輸入,本例使用如下的乙個圖來進行分析:
e = ((1,2,2),e表示乙個圖,它是乙個二維列表,三個一組表示一條邊,三個值分別為邊的起點、終點,以及該邊的權值。(1,4,1),
(2,4,3),
(2,5,10),
(3,1,4),
(3,6,5),
(4,3,2),
(4,6,8),
(4,7,4),
(4,5,2),
(5,7,6),
(7,6,1))
上面這個邊列表表示的圖如下:
只設計乙個頂點結構就ok了,頂點的表示如下:
classid表示頂點的編號;v_node(object):
def__init__
(self, id):
self.id =id
self.adja_list =0
self.path =0
self.kown =false
self.dist = float("
inf"
)
path表示到該頂點對應的最優路徑的上乙個頂點;
kown用來記錄改點的最短路徑是否已經找到;
dist表示改點當前路徑的長度;
adja_list用來存放改頂點的鄰接點的列表,採用二維列表,每個元組有兩個值:與改點相鄰的點的id、到該點的路徑的長度
2、演算法實現
def首先實現函式read_graph,它讀入乙個以單邊列表表示的圖,輸出乙個帶有鄰接表的頂點雜湊表;read_graph(edge):
hash ={}
for e in
edge:
ifhash.has_key(e[0]):
else
: v =v_node(e[0])
v.adja_list=[[e[1],e[2]]]
hash[e[0]] =v
if hash.has_key(e[1]) ==false:
v = v_node(e[1])
v.adja_list=
hash[e[1]] =v
return
hash
deffind_best_unkown(hash_unkown):
dist = float("
inf"
) id = -1
for k in
hash_unkown.keys():
if dist >hash_unkown[k].dist:
dist =hash_unkown[k].dist
id =k
return
iddef
print_path(hash_kown, v1, v2):
b_str = "
%d to %d:
" %(v1,v2)
if hash_kown.has_key(v2) ==false :
print b_str + "
no way form %d to %d
" %(v1, v2)
return
str = ""
while v2 !=v1:
str = "
->%d
" % v2 +str
v2 =hash_kown[v2].path
str = "
%d" % v2 +str
print b_str +str
deffind_best(edges, v1, v2):
hash_unkown =read_graph(edges)
hash_unkown[v1].dist =0
hash_unkown[v1].path =v1
hash_kown ={}
while 1:
v_id =find_best_unkown(hash_unkown)
#print "best: %d" % v_id
if v_id <0 :
break
hash_unkown[v_id].kown =true
hash_kown[v_id] =hash_unkown[v_id]
delhash_unkown[v_id]
for w in
hash_kown[v_id].adja_list:
ifhash_unkown.has_key(w[0]):
if hash_kown[v_id].dist + w[1]
hash_unkown[w[0]].dist = hash_kown[v_id].dist + w[1]
hash_unkown[w[0]].path =v_id
#for k in hash_kown.keys():
#hash_kown[k].show()
print_path(hash_kown,v1,v2)
# for test...
for i in range(1,8):
for j in range(1,8):
find_best(e, i, j)
然後實現函式find_best_unkown,它在未知頂點中尋找距源點路徑最短的乙個頂點並返回其id;
print_path函式用來列印出某個指定頂點的路徑資訊;
最終實現find_best函式,它接收乙個圖的單邊列表,以及源點v1和終點v2,然後計算並列印出v1到v2的最短路徑。
最後還有個for迴圈用來測試,將任意兩點間的最優路徑都計算出來。
Dijkstra最短路徑演算法
基本思路是 選擇出發點相鄰的所有節點中,權最小的乙個,將它的路徑設定為確定。其他節點的路徑需要儲存起來。然後從剛剛確認的那個節點的相鄰節點,算得那些節點的路徑長。然後從所有未確定的節點中選擇乙個路徑最短的設定為確定。重複上面步驟即可。void dijkstra graph g,string v fl...
Dijkstra最短路徑演算法
引入 dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。package dijkstra p...
最短路徑 Dijkstra演算法
最短路徑 描述 已知乙個城市的交通路線,經常要求從某一點出發到各地方的最短路徑。例如有如下交通圖 則從a出發到各點的最短路徑分別為 b 0c 10 d 50 e 30 f 60 輸入 輸入只有乙個用例,第一行包括若干個字元,分別表示各頂點的名稱,接下來是乙個非負的整數方陣,方陣維數等於頂點數,其中0...