最短路徑演算法 Dijkstra

2022-09-01 19:21:12 字數 2948 閱讀 8857

dijkstra是解決單源最短路徑的一般方法,屬於一種貪婪演算法。

所謂單源最短路徑是指在乙個賦權有向圖中,從某一點出發,到另一點的最短路徑。

以python**為例,實現dijkstra演算法

1、資料結構設計

假設圖以單邊列表的方式進行輸入,本例使用如下的乙個圖來進行分析:

e = ((1,2,2),

(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))

e表示乙個圖,它是乙個二維列表,三個一組表示一條邊,三個值分別為邊的起點、終點,以及該邊的權值。

上面這個邊列表表示的圖如下:

只設計乙個頂點結構就ok了,頂點的表示如下:

class

v_node(object):

def__init__

(self, id):

self.id =id

self.adja_list =0

self.path =0

self.kown =false

self.dist = float("

inf"

)

id表示頂點的編號;

path表示到該頂點對應的最優路徑的上乙個頂點;

kown用來記錄改點的最短路徑是否已經找到;

dist表示改點當前路徑的長度;

adja_list用來存放改頂點的鄰接點的列表,採用二維列表,每個元組有兩個值:與改點相鄰的點的id、到該點的路徑的長度

2、演算法實現

def

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)

首先實現函式read_graph,它讀入乙個以單邊列表表示的圖,輸出乙個帶有鄰接表的頂點雜湊表;

然後實現函式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...