多源最短路Floyd 演算法 matlab實現

2022-03-27 18:32:40 字數 1154 閱讀 1470

弗洛伊德(floyd)演算法是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一、2023年圖靈獎獲得者、史丹福大學電腦科學系教授羅伯特·弗洛伊德命名。

基本思想

通過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 的後續點

endend

endfor 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);

endend

endend

dist=a(sb,db);

mypath=sb; t=sb;

while t~=db

temp=path(t,db);

mypath=[mypath,temp];

t=temp;

endreturn

多源最短路 Floyd演算法

問題的提出 已知乙個有向網 或者無向網 對每一對定點vi vj,要求求出vi與vj之間的最短路徑和最短路徑的長度。解決該問題有以下兩種方法 1 輪流以每乙個定點為源點,重複執行dijkstra演算法或者bellman ford演算法n次,就可以求出每一對頂點之間的最短路徑和最短路徑的長度,總的時間複...

多源最短路演算法 Floyd演算法

我們知道單源最短路是指從某乙個源點到圖中的其它頂點的最短路。多源最短路就是指每乙個點到圖中其他頂點的最短路。那麼有的人肯定想我知道求單源最短路的演算法了,那麼有多少個點我就求多少次唄,這樣做時間效率不高,空間效率也極其低。那麼有什麼演算法求解多源最短路呢?floyd 鄰接矩陣存圖 int dp n ...

多源最短路(floyd)

floyd 就是很簡單很簡單的一種dp 3個for迴圈就出結果 看 就可以知道,floyd就是通過遍歷可能會出現i j比i k k j大的情況,很簡單。貼乙個水題 floyd考的話也是和其他演算法一起考 一般情況下由於floyd的本質,n方的鄰接鍊錶矩陣反而更有效率。include using na...