算法12最短路徑弗洛伊德Floyd算法_第1頁
算法12最短路徑弗洛伊德Floyd算法_第2頁
算法12最短路徑弗洛伊德Floyd算法_第3頁
算法12最短路徑弗洛伊德Floyd算法_第4頁
算法12最短路徑弗洛伊德Floyd算法_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

11.問題的提出:已知一個各邊權值均大于0的帶權有向圖,對每一對頂點vi

vj,要求求出vi

與vj之間的最短路徑和最短路徑長度。2.解決辦法方法一:每次以一個頂點為源點,重復執(zhí)行Dijkstra算法n次——T(n)=O(n3)方法二:弗洛伊德(Floyd)算法2求最短路徑步驟初始時設置一個n階方陣,令其對角線元素為0,若存在弧<Vi,Vj>,則對應元素為權值;否則為逐步試著在原直接路徑中增加中間頂點,若加入中間點后路徑變短,則修改之;否則,維持原值所有頂點試探完畢,算法結束3.Floyd算法思想:逐個頂點試探法從圖的帶權鄰接矩陣G.arcs出發(fā),假設求頂點Vi到Vj的最短路徑。如果從Vi到Vj有弧,則從Vi到Vj存在一條長度為G.arcs[i][j]的路徑,但該路徑是否一定是最短路徑,還需要進行n次試探。

1.第一次,判別(Vi,V0)和(V0,Vj),即判別(Vi,V0,Vj)是否存在,若存在,則比較(Vi,Vj)和(Vi,V0,Vj)的長度,取長度較短的為從Vi到Vj的中間頂點序號不大于0的最短路徑。

2.第二次,再加一個頂點V1,如果(Vi,…,V1)和(V1,…,Vj)分別是當前找到的中間頂點序號不大于0的最短路徑,那么(Vi,…,V1,…,Vj)就有可能是從Vi到Vj的中間頂點序號不大于1的最短路徑。將它和已經(jīng)得到的從Vi到Vj之間頂點序號不大于0的最短路徑相比較,取較短者為從Vi到Vj的中間頂點序號不大于1的最短路徑。

3.第三次,再加一個頂點V2,繼續(xù)進行試探。

V2V3V0V1123456890123012301240092350801608888D(-1)=

D(-1)為有向網(wǎng)的鄰接矩陣

第一步:以D(-1)為基礎,以V0為中間頂點,求從Vi到Vj的最短路徑。該路徑或者為從Vi到Vj的邊,或者為(Vi,V0)+(V0,Vj)。

D(0)[i][j]=

min{D(-1)[i][j],

D(-1)[i][0]+D(-1)[0][j]}47D(0)=

D(0)[i][j]為從Vi到Vj的中間頂點序號不大于0的最短路徑長度.V0V2V3V0V112345689

以D(0)為基礎,以V1為中間頂點,求從Vi,到Vj的最短路徑。該路徑或者為從Vi到Vj的邊,或者為從Vi開始通過V0或V1到達Vj的最短路徑。

D(1)[i][j]=

min{D(0)[i][j],

D(0)[i][1]+D(0)[1][j]}0123012301240092350801608888A(-1)=47D(0)=1036D(1)=V0V1V0V1V2V3V0V112345689

以D(1)為基礎,以V2為中間頂點,求從Vi,到Vj的最短路徑?;蛘邽閺腣i到Vj的邊,或者為從Vi開始通過V0,V1,V2到達Vj的最短路徑。

D(2)[i][j]=

min{D(1)[i][j],

D(1)[i][2]+D(1)[2][j]}0123012301240092350801608888A(-1)=47A(0)=1036D(1)=D(2)=12

910V0V1V20123012301240092350801608888A(-1)=47A(0)=1036A(1)=D(2)=12

910D(3)=V2V3V0V112345689

以D(2)為基礎,以V3為中間頂點,求從Vi,到Vj的最短路徑?;蛘邽閺腣i到Vj的邊,或者為從Vi開始通過V0,V1,V2,V3到達Vj的最短路徑。

D(3)[i][j]=

min{D(2)[i][j],

D(2)[i][3]+D(2)[3][j]}

9

11

8V3V2V0V1

D(3)[i][j]即為從Vi到Vj的最短路徑長度.9ACB264311041160230初始:路徑:ABACBA

BCCA046602370加入B:路徑:ABABCBA

BCCA

CAB0411602370加入A:路徑:ABACBA

BCCACAB046502370加入C:路徑:AB

ABCBCA

BCCA

CAB例題:10例ACB264311初始:041160230length=011202300path=加入A:0411602370length=011202310path=加入B:046602370length=012202310path=加入C:046502370length=012302310path=114.論點:A(-1)[i][j]是從頂點vi到vj,中間頂點是

v1的最短路徑的長度,A(k)[i][j]是從頂點vi到vj,中間頂點的序號不大于k的最短路徑的長度,A(n-1)[i][j]是從頂點vi到vj的最短路徑長度。證明:歸納證明,始歸納于s(上角標);(1)歸納基礎:當s=-1時,A(-1)[i][j]=Edge[i][j],vi到vj,不經(jīng)過任何頂點的邊,是最短路徑。(2)歸納假設:當s<k時,A(s)[i][j]是從頂點vi到vj,中間頂點的序號不大于s的最短路徑的長度;(3)當s=k時,12

ijkA(k-1)[i][k]A(k-1)[k][j]A(k-1)[i][j]因為:A(k)[i][j]=min{A(k-1)[i][j],

A(k-1)[i][k]+A(k-1)[k][j]}由歸納假設知:A(k-1)[i][j]:是i到j的最短路徑(標號不高于k-1);A(k-1)[i][k]:是i到k的最短路徑(標號不高于k-1);A(k-1)[k][j]:是k到j的最短路徑(標號不高于k-1);所以:A(k)[i][j]是i到j的最短路徑(標號不高于k)。

13圖用鄰接矩陣存儲edge[][]存放最短路徑長度path[i][j]是從Vi到Vj的最短路徑上Vj前一頂點序號5.算法實現(xiàn)voidfloyd(){

for(inti=0;i<n;i++)//矩陣dist與path初始化

for(int

j=0;j<n;j++){//置A(-1)dist[i][j]=Edge[i][j];

path[i][j]=-1;}//初始不經(jīng)過任何頂點

for(intk=0;k<n;k++)//產(chǎn)生dist(k)及path(k)for(i=0;i<n;i++) for(j=0;j<n;j++)if(dist[i][k]+dist[k][j]<dist[i][j]){

dist[i][j]=dist[i][k]+dist[k][j];

path[i][j]=k;}//縮短路徑,繞過k到j

}//floyd

146.算法分析:設最內層循環(huán)體為基本操作,算法有三層循環(huán)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論