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


代碼來源:《圖論算法及其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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM