1. 程式人生 > >【最短路】求兩點間最短路的Floyd算法及其matlab實現

【最短路】求兩點間最短路的Floyd算法及其matlab實現

以及 pre 實現 style div 是否 log inf 表示

代碼來源:《圖論算法及其matlab實現》(北京航空航天出版社)

P22

此代碼返回第一個點和最後一個點之間最短路徑,以及最短路徑的長度。

代碼如下:

 1 function [P,u ] = Floyd(W)
 2 %W表示權值矩陣
 3 %P表示最短路徑
 4 %u表示最短路的權和
 5 n=length(W);
 6 U=W;
 7 m=1;
 8 
 9 while m<=n   %判斷是否滿足停止條件
10     for i=1:n
11         for j=1:n
12             if U(i,j)>U(i,m)+U(m,j)
13
U(i,j)=U(i,m)+U(m,j); %更新dij 14 end 15 end 16 end 17 m=m+1; 18 end 19 u=U(1,n); 20 21 %輸出最短路的頂點 22 P1=zeros(1,n); 23 k=1; 24 P1(k)=n; 25 V=ones(1,n)*inf; 26 kk=n; 27 while kk~=1 28 for i=1:n 29 V(1,i)=U(1,kk)-W(i,kk); 30 if V(1,i)==U(1,i)
31 P1(k+1)=i; 32 kk=i; 33 k=k+1; 34 end 35 end 36 end 37 k=1; 38 wrow=find(P1~=0); 39 for j=length(wrow):(-1):1 40 P(k)=P1(wrow(j)); 41 k=k+1; 42 end 43 44 end

驗證:

n=12;
a=ones(n)+inf;
for i=1:n
a(i,i)=0;
end
a(1,2)=5;
a(
2,3)=8; a(2,6)=5; a(3,4)=3; a(3,9)=10; a(4,5)=5; a(4,7)=3; a(5,6)=2; a(7,8)=2; a(8,9)=4; a(8,11)=6; a(9,10)=3; a(10,11)=5; a(10,12)=3; [P u ] = Floyd(a)

運行結果:

P =

     1     2     3     9    10    12


u =

    29

【最短路】求兩點間最短路的Floyd算法及其matlab實現