一、 迪傑斯特拉演算法思想
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演算法是很有代表性的最短...