用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是 乙...