- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
All-Pairs Shortest Paths.ppt
All-Pairs Shortest Paths All-Pairs Shortest Paths 15.1 最短路徑的特性 最短路徑的結構:所有最短路徑的子路徑均為最短路徑。 如:(vi,…,vk,vj)為vi到vj的最短路徑,則(vi,…,vk)必為vi到vk的最短路徑。 即:δ(vi,vj)=δ(vi,vk)+w(vk,vj) 最短路徑的特性 一個直覺的遞迴解:定義d(m)(i,j)為包含至多m個邊自i?j的最短路徑長度。則: 利用遞迴解計算出最短路徑 令n=|V|,如一圖無負迴圈,則d(n-1)(i,j)即為i?j的最短路徑長度。 可以直覺使用動態規劃的方式來求出解,但耗時O(|V|3log|V|)反不如直接利用Dijkstra演算法直接求出所有點作為起點到其他點的最短路徑(以Linear array實做耗時O(|V|3))。 All-pairs Shortest Paths演算法 輸入: 一無負迴圈圖G=(V,E),|V|=n。 n×n adjacency matrix W=(W[i,j]) All-pairs Shortest Paths演算法 輸出: n×n minimum distance matrix D=(D[i,j]) D[i,j]=δ(i,j) n×n predecessor matrix π=(π[i,j]) 若i?j無路徑則π[i,j]=NIL, 否則π[i,j]紀錄i?j最短路徑上j之前的點 Extend-Shortest-Paths(D,W) { n?rows[D] Let D’ = (D’[i,j]) be an n?n matrix for i=1 to n do for j=1 to n do D’[i,j]?? for k=1 to n do D’[i,j]?min(D’[i,j],D[i,k]+W[k,j]) return D’ } Slow-All-Pairs-Shortest-Paths(G,W) { n?|V| D(1)?W for m=2 to n-1 do D(m)?Extend-Shortest-Paths(D(m-1),W) return D(n-1) } Faster-All-Pairs-Shortest-Paths(G,W) { n?|V| D(1)=W m=1 while n-1m do D(2m)?Extend-Shortest-Paths(D(m),D(m)) m = 2m return D(m) } 15.2 Floyd-Warshall演算法 主要利用不同的觀察找出新的遞迴式,使得演算法複雜度降低至O(n3),在邊數多的時候能有比Dijkstra演算法更迅速的求出所有的最短路徑。 若一i?j的路徑為(i,u1,…,um,j),則我們稱u1,…,um為該路徑的Intermediate vertex(中間點)。 Floyd-Warshall演算法 假定點集合V={1,…,n},定義d(m)(i,j)為中間點僅可能為{1,…,m}最短的i?j路徑長。故: Floyd-Warshall演算法正確性分析 考慮中間點僅可能為{1,…,k}。 如k不在i?j最短路徑上,則中間點僅可能為{1,…,k-1},故此時:d(k)(i,j)=d(k-1)(i,j)。 Floyd-Warshall演算法正確性分析 如k在i?j最短路徑上,則將i?k及k?j兩段分開看,這兩個路徑必然不可能有中間點為k,否則依照無負迴圈的假定,i?k或k?j不是最短路徑,違背最短路徑的性質。故此時: d(k)(i,j)=d(k-1)(i,k)+d(k-1)(k,j)。 Floyd-Warshall演算法 Floyd-Warshall(G,W) { n?|V| D(0)?W for k = 1 to n do for i = 1 to n do for j = 1 to n do if D(k-1)[i,j]D(k-1)[i,k]+D(k-1)[k,j] then D(k)[i,j]?D(k-1)[i,k]+D(k-1)[k,j] π[i,j]? π[k,j] else D(k)[i,j]?D(k-1)[i,j] return D(n) } 建造Shortest path 初始化π[i,j]時,如i=j或(i,j)?E則初始為NIL,否則初始為i。 等執行完演算法後,則可利用Single-Source shortest path的方式,藉由Predecessor graph來建立出i?j的最短路徑。 Floyd-Wars
文档评论(0)