自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

探究最短路問(wèn)題:Dijkstra算法

開(kāi)發(fā) 前端 算法
最短路問(wèn)題最短路問(wèn)題(Shortest Path Problems):給定一個(gè)網(wǎng)絡(luò),網(wǎng)絡(luò)的邊上有權(quán)重,找一條從給定起點(diǎn)到給定終點(diǎn)的路徑使路徑上的邊權(quán)重總和最小。

[[386543]]

 在上次寫(xiě)道關(guān)于數(shù)據(jù)結(jié)構(gòu)的圖,圖的算法的考點(diǎn)只有一個(gè):最短路問(wèn)題。

最短路問(wèn)題

最短路問(wèn)題(Shortest Path Problems):給定一個(gè)網(wǎng)絡(luò),網(wǎng)絡(luò)的邊上有權(quán)重,找一條從給定起點(diǎn)到給定終點(diǎn)的路徑使路徑上的邊權(quán)重總和最小。


比如上圖的:圖中點(diǎn)1到點(diǎn)4的最短路徑長(zhǎng)度應(yīng)為3(從1到2到4)。

最短路問(wèn)題常用Dijkstra算法解決

Dijkstra算法

Dijkstra算法是典型的單源最短路徑算法,用于計(jì)算一個(gè)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的最短路徑。主要特點(diǎn)是以起始點(diǎn)為中心向外層層擴(kuò)展,直到擴(kuò)展到終點(diǎn)為止。

比如,上圖Dijkstra算法就是不斷地尋找開(kāi)始節(jié)點(diǎn)到鄰居節(jié)點(diǎn)的所有的路徑,將最初的距離設(shè)置為最短距離,然后不斷的更新節(jié)鄰居節(jié)點(diǎn)的最短距離,直到最遠(yuǎn)的節(jié)點(diǎn)的最短距離求解出來(lái)的過(guò)程。

文字描述不清楚,看下面的動(dòng)圖。

圖片

將圖上的頂點(diǎn)分為已訪問(wèn)visited和未訪問(wèn)node兩個(gè)集合。

每次從visited向外拓展一個(gè)點(diǎn),拓展規(guī)則是在可更新的點(diǎn)里是距離最小的。

我們還是以上面的圖為例


先用鄰接矩陣表示無(wú)向圖:

  1. MAX = 9999 
  2.  
  3. g= [ 
  4.     [0, 1, 4, 6], 
  5.     [MAX, 0, MAX, 2], 
  6.     [MAXMAX, 0, 1], 
  7.     [MAXMAXMAX, 0] 

鄰接矩陣g[0][1]=1表示,第一個(gè)節(jié)點(diǎn)到第二個(gè)節(jié)點(diǎn)的距離是1。

目的是要求出開(kāi)始點(diǎn)1到其他各個(gè)點(diǎn)的最小路徑距離

  1. n = 4 #4個(gè)點(diǎn) 
  2. # 初始化 visited  
  3. visitd = [0] * (n) #記錄該點(diǎn)是否為訪問(wèn)過(guò) 
  4. # 第一個(gè)點(diǎn)已經(jīng)訪問(wèn)了 
  5. visitd[0] = 1 
  6. #初始化源點(diǎn)到各個(gè)點(diǎn)的距離 node 集合 
  7. d = g[0] 
  8.  
  9. for i in range(2, n): 
  10.     # 遍歷d 取出權(quán)重最小節(jié)點(diǎn)的位置 
  11.     minWeigth = MAX 
  12.     for j in range(2, n): 
  13.         if d[j] < minWeigth and visitd[j] == 0: 
  14.             minWeigth = d[j] 
  15.             k = j 
  16.             # 表示k是當(dāng)前距1最短的點(diǎn),同時(shí)標(biāo)記k已經(jīng)被找過(guò) 
  17.     visitd[k] = 1 
  18.     #  用該點(diǎn)進(jìn)行松弛(relax) 
  19.     for j in range(2, n): 
  20.         if d[j] > d[k] + g[k][j] and visitd[j] == 0: 
  21.             d[j] = d[k] + g[k][j] 
  22.  
  23. for i in range(1,n): 
  24.     print(d[i]) 
  25.      

至此,得到節(jié)點(diǎn)1到其余三個(gè)節(jié)點(diǎn)的最短距離是1、4和5。

「把Dijkstra 算法應(yīng)用于無(wú)權(quán)圖,或者所有邊的權(quán)都相等的圖,Dijkstra 算法等同于BFS搜索。」

多點(diǎn)求解

在很多的時(shí)候,要求輸入一組點(diǎn),然后求出輸入一個(gè)起始點(diǎn),得到無(wú)向圖最短路徑。

  1. import math 
  2. # 假設(shè)圖中的頂點(diǎn)數(shù) 
  3. V = 6 
  4. # 標(biāo)記數(shù)組:used[v]值為False說(shuō)明改頂點(diǎn)還沒(méi)有訪問(wèn)過(guò),在S中,否則在U中! 
  5. used = [False for _ in range(V)] 
  6. # 距離數(shù)組:distance[i]表示從源點(diǎn)s到i的最短距離,distance[s]=0 
  7. distance = [float('inf'for _ in range(V)] 
  8. # cost[u][v]表示邊e=(u,v)的權(quán)值,不存在時(shí)設(shè)為INF 
  9. # cost領(lǐng)接表 
  10. cost = [[float('inf'for _ in range(V)] for _ in range(V)] 
  11.  
  12. def dijkstra(s): 
  13.     distance[s] = 0 
  14.     while True
  15.         # v在這里相當(dāng)于是一個(gè)哨兵,對(duì)包含起點(diǎn)s做統(tǒng)一處理! 
  16.         v = -1 
  17.         # 從未使用過(guò)的頂點(diǎn)中選擇一個(gè)距離最小的頂點(diǎn) 
  18.         for u in range(V): 
  19.             if not used[u] and (v == -1 or distance[u] < distance[v]): 
  20.                 v = u 
  21.         if v == -1: 
  22.             # 說(shuō)明所有頂點(diǎn)都維護(hù)到S中了! 
  23.             break 
  24.         # 將選定的頂點(diǎn)加入到S中, 同時(shí)進(jìn)行距離更新 
  25.         used[v] = True 
  26.         # 更新U中各個(gè)頂點(diǎn)到起點(diǎn)s的距離。之所以更新U中頂點(diǎn)的距離,是由于上一步中確定了k是求出最短路徑的頂點(diǎn),從而可以利用k來(lái)更新其它頂點(diǎn)的距離;例如,(s,v)的距離可能大于(s,k)+(k,v)的距離。 
  27.         for u in range(V): 
  28.             distance[u] = min(distance[u], distance[v] + cost[v][u]) 
  29.  
  30.  
  31. for _ in range(9): 
  32.     v, u, w = list(map(int, input().split())) 
  33.     cost[v][u] = w 
  34.     cost[u][v] = w 
  35. s = int(input('請(qǐng)輸入一個(gè)起始點(diǎn):')) 
  36. dijkstra(s) 
  37. print(distance) 

測(cè)試用例

  1. 0 1 1 
  2. 0 2 2 
  3. 0 3 3 
  4. 1 4 7 
  5. 1 5 9 
  6. 2 4 4 
  7. 3 4 5 
  8. 3 5 6 
  9. 4 5 8 
  10. 請(qǐng)輸入一個(gè)起始點(diǎn):0 
  11. [0, 1, 2, 3, 6, 9] 

在測(cè)試用例中的0 1 1表示第一個(gè)頂點(diǎn)到第二個(gè)頂點(diǎn)的距離是1。

Dijkstra算法使用鄰接表的時(shí)間復(fù)雜度是。因此,很多使用堆進(jìn)行優(yōu)化或者使用散列表對(duì)多余的空間進(jìn)行優(yōu)化。

 

責(zé)任編輯:姜華 來(lái)源: Python之王
相關(guān)推薦

2011-05-17 13:58:37

最短路徑

2011-05-17 14:29:29

Dijkstra

2011-05-17 14:11:06

Dijkstra

2013-06-24 09:37:34

OSPF協(xié)議SPF算法路由技術(shù)

2013-04-23 09:31:52

SQL Server

2011-12-19 12:39:37

Java

2021-05-10 08:07:40

圖算法路徑頂點(diǎn)

2014-03-26 09:04:42

算法Floyd最短算法

2024-05-24 08:00:00

2015-07-16 14:25:56

SDN網(wǎng)絡(luò)感知服務(wù)

2024-04-02 11:37:59

AGI網(wǎng)絡(luò)模型GAN

2021-08-26 17:36:42

Floyd算法數(shù)據(jù)結(jié)構(gòu)

2011-06-01 09:27:00

OSPF路由路由器

2020-04-22 11:19:07

貪心算法動(dòng)態(tài)規(guī)劃

2022-11-28 10:14:16

研究算法

2015-12-07 17:07:36

SDN網(wǎng)絡(luò)流量

2021-08-09 06:57:44

最短路傳入函數(shù)

2021-09-08 10:32:29

微服務(wù)容器化Serverless

2013-12-23 09:25:21

2011-04-11 16:32:28

路徑C++
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)