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


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

 


免責聲明!

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



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