成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

探究最短路問題:Dijkstra算法

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

[[386543]]

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

最短路問題

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


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

最短路問題常用Dijkstra算法解決

Dijkstra算法

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

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

文字描述不清楚,看下面的動圖。

圖片

將圖上的頂點分為已訪問visited和未訪問node兩個集合。

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

我們還是以上面的圖為例


先用鄰接矩陣表示無向圖:

  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表示,第一個節(jié)點到第二個節(jié)點的距離是1。

目的是要求出開始點1到其他各個點的最小路徑距離

  1. n = 4 #4個點 
  2. # 初始化 visited  
  3. visitd = [0] * (n) #記錄該點是否為訪問過 
  4. # 第一個點已經(jīng)訪問了 
  5. visitd[0] = 1 
  6. #初始化源點到各個點的距離 node 集合 
  7. d = g[0] 
  8.  
  9. for i in range(2, n): 
  10.     # 遍歷d 取出權(quán)重最小節(jié)點的位置 
  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最短的點,同時標記k已經(jīng)被找過 
  17.     visitd[k] = 1 
  18.     #  用該點進行松弛(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é)點1到其余三個節(jié)點的最短距離是1、4和5。

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

多點求解

在很多的時候,要求輸入一組點,然后求出輸入一個起始點,得到無向圖最短路徑。

  1. import math 
  2. # 假設(shè)圖中的頂點數(shù) 
  3. V = 6 
  4. # 標記數(shù)組:used[v]值為False說明改頂點還沒有訪問過,在S中,否則在U中! 
  5. used = [False for _ in range(V)] 
  6. # 距離數(shù)組:distance[i]表示從源點s到i的最短距離,distance[s]=0 
  7. distance = [float('inf'for _ in range(V)] 
  8. # cost[u][v]表示邊e=(u,v)的權(quán)值,不存在時設(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)于是一個哨兵,對包含起點s做統(tǒng)一處理! 
  16.         v = -1 
  17.         # 從未使用過的頂點中選擇一個距離最小的頂點 
  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.             # 說明所有頂點都維護到S中了! 
  23.             break 
  24.         # 將選定的頂點加入到S中, 同時進行距離更新 
  25.         used[v] = True 
  26.         # 更新U中各個頂點到起點s的距離。之所以更新U中頂點的距離,是由于上一步中確定了k是求出最短路徑的頂點,從而可以利用k來更新其它頂點的距離;例如,(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('請輸入一個起始點:')) 
  36. dijkstra(s) 
  37. print(distance) 

測試用例

  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. 請輸入一個起始點:0 
  11. [0, 1, 2, 3, 6, 9] 

在測試用例中的0 1 1表示第一個頂點到第二個頂點的距離是1。

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

 

責(zé)任編輯:姜華 來源: 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

2021-05-10 08:07:40

圖算法路徑頂點

2011-12-19 12:39:37

Java

2014-03-26 09:04:42

算法Floyd最短算法

2024-05-24 08:00:00

2021-08-26 17:36:42

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

2015-07-16 14:25:56

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

2024-04-02 11:37:59

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

2020-04-22 11:19:07

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

2011-06-01 09:27:00

OSPF路由路由器

2022-11-28 10:14:16

研究算法

2013-12-23 09:25:21

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

2009-11-12 14:32:00

BGP路由協(xié)議
點贊
收藏

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

主站蜘蛛池模板: 欧美成人激情 | 91精品国产综合久久久久久 | 一区影院 | 精品视频免费在线 | 日韩另类 | 国产成人综合网 | 成人小视频在线观看 | 日本中文在线视频 | 日韩在线小视频 | 狼人伊人影院 | 欧美一区二区三区免费在线观看 | 日本电影韩国电影免费观看 | 国产精品不卡视频 | 午夜精品一区二区三区免费视频 | 欧美日韩看片 | 99中文字幕| 成人妇女免费播放久久久 | h视频免费观看 | 午夜精品久久久久久久久久久久久 | 欧美国产日本一区 | 国内精品伊人久久久久网站 | 亚洲精品成人 | 国产高清在线观看 | 欧美日韩亚洲一区 | 黄色亚洲 | 亚洲欧美一区在线 | 狠狠的干 | 亚洲国产成人精品女人久久久 | 日韩在线观看视频一区 | 精品在线 | 国产一区二区在线视频 | 成人区精品一区二区婷婷 | 久久手机视频 | 久久最新精品视频 | 久久综合一区二区三区 | www.97zyz.com| 黄片毛片免费观看 | 国产精品免费一区二区三区四区 | 国产日韩欧美一区二区 | 国产精品成人一区二区 | 一区二区三区在线 | 欧 |