中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用Dijkstra算法

發布時間:2021-10-18 09:54:45 來源:億速云 閱讀:172 作者:柒染 欄目:web開發

怎么使用Dijkstra算法,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

最短路問題

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

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

Dijkstra算法

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

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

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

怎么使用Dijkstra算法

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

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

我們還是以上面的圖為例

怎么使用Dijkstra算法

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

MAX = 9999  g= [     [0, 1, 4, 6],     [MAX, 0, MAX, 2],     [MAX, MAX, 0, 1],     [MAX, MAX, MAX, 0] ]

鄰接矩陣g[0][1]=1表示,第一個節點到第二個節點的距離是1。

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

n = 4 #4個點 # 初始化 visited  visitd = [0] * (n) #記錄該點是否為訪問過 # 第一個點已經訪問了 visitd[0] = 1 #初始化源點到各個點的距離 node 集合 d = g[0]  for i in range(2, n):     # 遍歷d 取出權重最小節點的位置     minWeigth = MAX     for j in range(2, n):         if d[j] < minWeigth and visitd[j] == 0:             minWeigth = d[j]             k = j             # 表示k是當前距1最短的點,同時標記k已經被找過     visitd[k] = 1     #  用該點進行松弛(relax)     for j in range(2, n):         if d[j] > d[k] + g[k][j] and visitd[j] == 0:             d[j] = d[k] + g[k][j]  for i in range(1,n):     print(d[i])      1 4 5

至此,得到節點1到其余三個節點的最短距離是1、4和5。

「把Dijkstra 算法應用于無權圖,或者所有邊的權都相等的圖,Dijkstra 算法等同于BFS搜索。」

多點求解

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

import math # 假設圖中的頂點數 V = 6 # 標記數組:used[v]值為False說明改頂點還沒有訪問過,在S中,否則在U中! used = [False for _ in range(V)] # 距離數組:distance[i]表示從源點s到i的最短距離,distance[s]=0 distance = [float('inf') for _ in range(V)] # cost[u][v]表示邊e=(u,v)的權值,不存在時設為INF # cost領接表 cost = [[float('inf') for _ in range(V)] for _ in range(V)]  def dijkstra(s):     distance[s] = 0     while True:         # v在這里相當于是一個哨兵,對包含起點s做統一處理!         v = -1         # 從未使用過的頂點中選擇一個距離最小的頂點         for u in range(V):             if not used[u] and (v == -1 or distance[u] < distance[v]):                 v = u         if v == -1:             # 說明所有頂點都維護到S中了!             break         # 將選定的頂點加入到S中, 同時進行距離更新         used[v] = True         # 更新U中各個頂點到起點s的距離。之所以更新U中頂點的距離,是由于上一步中確定了k是求出最短路徑的頂點,從而可以利用k來更新其它頂點的距離;例如,(s,v)的距離可能大于(s,k)+(k,v)的距離。         for u in range(V):             distance[u] = min(distance[u], distance[v] + cost[v][u])   for _ in range(9):     v, u, w = list(map(int, input().split()))     cost[v][u] = w     cost[u][v] = w s = int(input('請輸入一個起始點:')) dijkstra(s) print(distance)

測試用例

0 1 1 0 2 2 0 3 3 1 4 7 1 5 9 2 4 4 3 4 5 3 5 6 4 5 8 請輸入一個起始點:0 [0, 1, 2, 3, 6, 9]

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

Dijkstra算法使用鄰接表的時間復雜度是怎么使用Dijkstra算法。因此,很多使用堆進行優化或者使用散列表對多余的空間進行優化。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

四会市| 溆浦县| 重庆市| 噶尔县| 盘山县| 永泰县| 禄劝| 凉城县| 三穗县| 夹江县| 巴林左旗| 新丰县| 玉门市| 绍兴县| 阳山县| 集贤县| 六枝特区| 鄯善县| 高淳县| 巨野县| 米林县| 玛多县| 甘德县| 工布江达县| 德令哈市| 威宁| 马尔康县| 灵山县| 溆浦县| 淳安县| 神木县| 泸溪县| 调兵山市| 平安县| 罗田县| 平泉县| 邛崃市| 南城县| 昭觉县| 关岭| 沁水县|