最短路徑演算法 Dijkstra 和Floyd

2021-10-03 10:30:43 字數 2021 閱讀 4834

思想:dijkstra是求單源最短路徑,floyd演算法是用於求多源最短路徑,算出來的是所有的節點到其餘各節點之間的最短距離。

先遍歷一下還沒有在最短路中的點,選出乙個距離 已經在最短路集合中的點 距離最近的點(遍歷與 最短路包含的點 相連的節點),並把它加入到最短路中,並且更新所有點的最短路,直到所有的點都加入到最短路中。

**參考:

(1)初始時,s只包含起點s;u包含除s外的其他頂點,且u中頂點的距離為"起點s到該頂點的距離"[例如,u中頂點v的距離為(s,v)的長度,然後s和v不相鄰,則v的距離為∞]。 

(2)從u中選出"距離最短的頂點k",並將頂點k加入到s中;同時,從u中移除頂點k。 

(3)更新u中各個頂點到起點s的距離。之所以更新u中頂點的距離,是由於上一步中確定了k是求出最短路徑的頂點,從而可以利用k來更新其它頂點的距離;例如,(s,v)的距離可能大於(s,k)+(k,v)的距離。 

(4)重複步驟(2)和(3),直到遍歷完所有頂點。 

#leetcode1368困難

class solution:

def mincost(self, grid: list[list[int]]) -> int:

#0302 30min

'''dijkstra 演算法適合用來求出無負權邊圖中的單源最短路徑。其中「無負權邊」表示圖中所有邊的權值必須為非負數,「單源最短路徑」表示 dijkstra 演算法可以求出從某乙個節點到其餘所有節點的最短路徑。'''

m, n = len(grid), len(grid[0])

big = int(1e9)

dist = [0] + [big] * (m * n - 1) #無窮,到每個點距離

seen = set()#訪問過的節點

q = [(0, 0, 0)] #第乙個節點加入

while len(q) > 0:

if (x, y) in seen:##已經獲得最短節點,不再遍歷

continue

seen.add((x, y)) #加入

cur_pos = x * n + y #當前位置

for i, (nx, ny) in enumerate([(x, y + 1), (x, y - 1), (x + 1, y), (x - 1, y)]):

new_pos = nx * n + ny

new_dis = dist[cur_pos] + (1 if grid[x][y] != i + 1 else 0) #難點:不相等不能到nx,xy

if 0 <= nx < m and 0 <= ny < n and new_dis < dist[new_pos]:

dist[new_pos] = new_dis #更新最短路徑

return dist[m * n - 1]

一、先找出最短的距離

第二、然後在考慮如何找出對應的行進路線。

如何找出最短路徑呢,這裡還是用到動態規劃的知識,

所以可以令k=1,2,3,...,n(n是城市的數目),在檢查d(ij)與d(ik)+d(kj)的值

若有d(ij)>d(ik)+d(kj):d(ij)=d(ik)+d(kj),重複這一過程,最後當查完所有的k時,d(ij)裡面存放的就是i到j之間的最短距離了。

1. 用i,j兩個變數分別指向二元組裡的兩個元素,比如這個二元組,i指向0;j指向1

2. 判斷 (a[ i ][ 0 ]+a[ 0 ][ j ] ) < a[ i ][ j ] (即判斷 i -> j,i點到j點的距離是否小於從0點中轉的距離),如果false,則判斷下一組二元陣列。

3. 如果表示式為真,更新a[ i ] [ j ]的值為a[ i ] [ 0 ] + a[ 0 ] [ j ],path[ i ] [ j ]的值為點0(即設定i到j要經過0點中轉)

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...