Python實現迪傑斯特拉演算法過程解析

2022-10-06 04:12:10 字數 2250 閱讀 6367

一、 迪傑斯特拉演算法思想

dijkstra演算法主要針對的是有向圖的單元最短路徑問題,且不能出現權值為負的情況!dijkstra演算法類似於貪心演算法,其應用根本在於最短路徑的最優子結構性質。

最短路徑的最優子結構性質:程式設計客棧

如果p(i,j)=是從頂點i到j的最短路徑,k和s是這條路徑上的乙個中間頂點,那麼p(k,s)必定是從k到s的最短路徑。

證明:假設p(i,j)=是從頂點i到j的最短路徑,則有p(i,j)=p(i,k)+p(k,s)+p(s,j)。而p(k,s)不是從k到s的最短距離,那麼必定存在另一條從k到s的最短路徑p(k,s),那麼p(i,j)=p(i,k)+p(k,s)+p(s,j)

因此,dijkstra演算法描述如下:

dijikstra演算法描述如下:

假設存在g=,源頂點為v0,s=,distance[i]記錄v0到i的最短距離,matrix[i][j]記錄從i到j的邊的權值,即兩點之間的距離。

1)從v-s中選擇使dist[i]值最小的頂點i,將i加入到u中;

2)更新與i直接相鄰頂點的dist值。dist[j]=min

3)直到s=v,所有頂點都包含進來了,演算法停止。

二、 具體操作步驟

根據其演算法思想,確立操作步驟如下:

(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),直到遍歷完所有頂點。

三、**

def dijkstra(s, used, cost, dista程式設計客棧nce, n):

distance[s] = 0

while true:

# v在這裡相當於是乙個哨兵,對包含起點s做統一處理!

v = -1

# 從未使用過的頂點中選擇乙個距離最小的頂點

for u in range(n):

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

distance[u] = min(distance[u], distance[v] + cost[v][u])

return 程式設計客棧distance

n, m, t = map(int, input().split())

# 標記陣列:used[v]值為false說明改頂點還沒有訪問過,在s中,否則在u中!

used = [false for _ in range(n)]

# 距離陣列:distance[i]表示從源點s到i的最短距離,distance[s]=0

distance = [float('inf') for _ in range(n)]

# cost[u][v]表示邊e=(u,v)的權值,不存在時設為inf

cost = [[float('inf') for _ in range(n)] for _ in range(n)]

for _ in range(m):

e = list(map(int, input().split()))

cost[e[0] - 1][e[1] - 1] = e[2]

dis1 = dijkstra(0, used[:], cost, distance[:], n)

d1 = dis1[-1]

dis2 = dijkstra(n-1, used[:], cost, distance[:], n)

d2 = dis2[0]

print((d1+d2)*t)

本文標題: python實現迪傑斯特拉演算法過程解析

本文位址: /jiaoben/python/347126.html

Python實現迪傑斯特拉演算法

一 迪傑斯特拉演算法思想 dijkstra演算法主要針對的是有向圖的單元最短路徑問題,且不能出現權值為負的情況!dijkstra演算法類似於貪心演算法,其應用根本在於最短路徑的最優子結構性質。最短路徑的最優子結構性質 如果p i,j 是從頂點i到j的最短路徑,k和s是這條路徑上的乙個中間頂點,那麼p...

迪傑斯特拉演算法

if object id t test is not null drop table t test gocreate table dbo t test id int identity 1,1 not null primary key,自增字段,無意義 header varchar 500 第一點的名...

迪傑斯特拉演算法

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...