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

【最短路】求兩點間最短路徑的改進的Dijkstra算法及其matlab實現

inf 效率 func 圖論 表示圖 function nes 航空航天 ogr

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

P18

書中提出了基於經典Dijkstra算法改進的兩種算法。

其中算法Ⅱ的效率較高。

代碼如下:

 1 function a=Dijk(a)
 2 %a(輸入量)表示圖的鄰接矩陣
 3 %a(輸出量)表示所求最短路徑的距離矩陣
 4 
 5 %建立鄰接矩陣,若不還是對稱矩陣,則變為對稱矩陣
 6 n=length(a);
 7 for i=2:n
 8     for j=1:(i-1)
 9         a(i,j)=a(j,i);
10     end
11 end
12 
13 %The main program
14 15 %步驟2.1 16 for k=1:(n-1) 17 b=[1:(k-1),(k+1):n]; 18 kk=length(b); 19 a_id=k; 20 b1=(k+1):n; 21 kk1=length(b1); 22 %步驟2.2.1 23 while kk>0 24 for j=1:kk1 25 te=a(k,a_id)+a(a_id,b1(j)); 26 if te<a(k,b1(j)) 27 a(k,b1(j))=te;
28 end 29 end 30 31 miid=1; 32 33 34 for j=2:kk 35 if a(k,b(j))<a(k,b(miid)) 36 miid=j; 37 end 38 end 39 40 a_id=b(miid); 41 b=[b(1:(miid-1)),b((miid+1):kk)]; 42 kk=length(b);
43 if a_id>k 44 miid1=find(b1==a_id); 45 b1=[b1(1:(miid1-1)),b1((miid1+1):kk1)]; 46 kk1=length(b1); 47 end 48 end 49 50 51 for j=(k+1):n 52 a(j,k)=a(k,j); 53 end 54 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;
Dijk(a)

運行結果如下:

ans =

     0     5    13    16    12    10    19    21    23    26    27    29
     5     0     8    11     7     5    14    16    18    21    22    24
    13     8     0     3     8    10     6     8    10    13    14    16
    16    11     3     0     5     7     3     5     9    12    11    15
    12     7     8     5     0     2     8    10    14    17    16    20
    10     5    10     7     2     0    10    12    16    19    18    22
    19    14     6     3     8    10     0     2     6     9     8    12
    21    16     8     5    10    12     2     0     4     7     6    10
    23    18    10     9    14    16     6     4     0     3     8     6
    26    21    13    12    17    19     9     7     3     0     5     3
    27    22    14    11    16    18     8     6     8     5     0     8
    29    24    16    15    20    22    12    10     6     3     8     0

【最短路】求兩點間最短路徑的改進的Dijkstra算法及其matlab實現