弗洛伊德(Floyd)算法是一種用於尋找給定的加權圖中頂點間最短路徑的算法。該算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特·弗洛伊德命名。
基本思想
通過Floyd計算圖G=(V,E)中各個頂點的最短路徑時,需要引入一個矩陣S,矩陣S中的元素a[i][j]表示頂點i(第i個頂點)到頂點j(第j個頂點)的距離。
假設圖G中頂點個數為N,則需要對矩陣S進行N次更新。初始時,矩陣S中頂點a[i][j]的距離為頂點i到頂點j的權值;如果i和j不相鄰,則a[i][j]=∞。 接下來開始,對矩陣S進行N次更新。第1次更新時,如果"a[i][j]的距離" > "a[i][0]+a[0][j]"(a[i][0]+a[0][j]表示"i與j之間經過第1個頂點的距離"),則更新a[i][j]為"a[i][0]+a[0][j]"。 同理,第k次更新時,如果"a[i][j]的距離" > "a[i][k]+a[k][j]",則更新a[i][j]為"a[i][k]+a[k][j]"。更新N次之后,操作完成!
matlab代碼函數如下:
function [dist,mypath]=myfloyd(a,sb,db); % 輸入:a—鄰接矩陣(aij)是指i 到j 之間的距離,可以是有向的 % sb—起點的標號;db—終點的標號 % 輸出:dist—最短路的距離;% mypath—最短路的路徑 n=size(a,1); path=zeros(n); for i=1:n for j=1:n if a(i,j)~=inf path(i,j)=j; %j 是i 的后續點 end end end for k=1:n for i=1:n for j=1:n if a(i,j)>a(i,k)+a(k,j) a(i,j)=a(i,k)+a(k,j); path(i,j)=path(i,k); end end end end dist=a(sb,db); mypath=sb; t=sb; while t~=db temp=path(t,db); mypath=[mypath,temp]; t=temp; end return