floyd,dijkstra演算法分析

2021-10-22 18:28:55 字數 1366 閱讀 5444

用floyd演算法求解下圖各個頂點的最短距離。

從任意節點i到任意節點j的最短路徑不外乎2種可能:1)直接從節點i到節點j,2)從節點i經過若干個節點k到節點j。所以,我們假設dis(i,j)為節點i到節點j的最短路徑的距離,對於每乙個節點k,我們檢查dis(i,k) + dis(k,j) < dis(i,j)是否成立,如果成立,證明從節點i到節點k再到節點j的路徑比節點i直接到節點j的路徑短,我們便設定dis(i,j) = dis(i,k) + dis(k,j),這樣一來,當我們遍歷完所有節點k,dis(i,j)中記錄的便是節點i到節點j的最短路徑的距離。

for k in range(n):

for i in range(n):

for j in range(n):

graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])

[演算法複雜度推導]

[github原始碼位址]

用dijkstra演算法求解下圖各個頂點的最短距離。

1.將所有的頂點分為兩部分:已知最短路程的頂點集合 p 和未知最短路徑的頂點集合 q。最開始,已知最短路徑的頂點集合 p 中只有源點乙個頂點。這裡用乙個 visited[ i ]陣列來記錄哪些點在集合 p 中。例如對於某個頂點 i,如果 visited[ i ]為 1 則表示這個頂點在集合 p 中,如果 visited[ i ]為 0 則表示這個頂點在集合 q 中;

2.設定源點 s 到自己的最短路徑為 0 即 dis = 0。若存在源點有能直接到達的頂點 i,則把 dis[ i ]設為 g[s][ i ]。同時把所有其它(源點不能直接到達的)頂點的最短路徑為設為 ∞;

3.在集合 q 的所有頂點中選擇乙個離源點 s 最近的頂點 u(即 dis[u] 最小)加入到集合 p。並考察所有以點 u 為起點的邊,對每一條邊進行鬆弛操作。例如存在一條從 u 到 v 的邊,那麼可以通過將邊 u->v 新增到尾部來拓展一條從 s 到 v 的路徑,這條路徑的長度是 dis[u] + g[u][v]。如果這個值比目前已知的 dis[v] 的值要小,我們可以用新值來替代當前 dis[v] 中的值;

4.重複第 3 步,如果集合 q 為空,演算法結束。最終 dis 陣列中的值就是源點到所有頂點的最短路徑

3.設計

s ←dist【s, s】 ←0

for vi∈ v- do

dist【s,vi】← wv(s,vi)

(when v not found,dist【s,v】←oo)

while v- s ≠ø do

find min dist[s,vi]from the set v-s

s<- s u

for vi∈ v- s do

if dist[s,vj]+wj,io(n2)

[github原始碼位址]

最短路徑 Floyd,Dijkstra(王道)

題目描述 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?輸入 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000...

演算法基礎( 演算法)

演算法基礎 演算法 hash演算法有兩種,即sha 1和md5演算法這裡先介紹md5演算法.md5產生乙個128位的hash值,在經過一寫初始樹立後,將明文分成了512位的塊,再將每一塊分成16個32位的子塊。演算法的輸出是4個32位的塊,連線起來構成128位的hash值。首先,將訊息填充到比512...

演算法 分治演算法

分治策略主要利用遞迴來解決問題,它包括以下三個步驟 分解 將問題分解為一與原問題類似並且比原問題規模更小的子問題 解決 當分解的子問題足夠小時,直接給出答案,否則用遞迴打方式求解 合併 將子問題的解合成原問題的解 下面考慮乙個簡單的利用分治演算法的歸併排序的例子 問題的形式化描述如下 輸入 a是 乙...