代码改变世界

Dijkstra算法——方法(二)

2013-03-26 20:31  Keiven_LY  阅读(306)  评论(0)    收藏  举报
最短路函数部分:
 
 
function [d,DD]=dijkstra(D,s)
 
%Dijkstra最短路算法Matlab程序用于求从起始点s到其它各点的最短路
%D为赋权邻接矩阵
%d为s到其它各点最短路径的长度
%DD记载了最短路径生成树
 
[m,n]=size(D);
d=inf.*ones(1,m);
d(1,s)=0;
dd=zeros(1,m);
dd(1,s)=1;
y=s;
DD=zeros(m,m);
DD(y,y)=1;
counter=1;
while length(find(dd==1))<m
     for i=1:m
         if dd(i)==0
             d(i)=min(d(i),d(y)+D(y,i));
         end
     end
     ddd=inf;
     for i=1:m
         if dd(i)==0&&d(i)<ddd
             ddd=d(i);
         end
     end
     yy=find(d==ddd);
     counter=counter+1;
     DD(y,yy(1,1))=counter;
     DD(yy(1,1),y)=counter;
     y=yy(1,1);
     dd(1,y)=1;
end
 
 
主函数部分:
   clear;
   w=inf*ones(7);
   
% 邻接矩阵如下
%        Inf       Inf       Inf    1.2000    9.2000       Inf    0.5000
%        Inf       Inf       Inf    5.0000       Inf    3.1000    2.0000
%        Inf       Inf       Inf       Inf       Inf    4.0000    1.5000
%     1.2000    5.0000       Inf       Inf    6.7000       Inf       Inf
%     9.2000       Inf       Inf    6.7000       Inf   15.6000       Inf
%        Inf    3.1000    4.0000       Inf   15.6000       Inf       Inf
%     0.5000    2.0000    1.5000       Inf       Inf       Inf       Inf
 
   w(1,7)=0.5;w(1,4)=1.2;w(1,5)=9.2;
   w(2,7)=2;w(2,4)=5;w(2,6)=3.1;
   w(3,7)=1.5;w(3,6)=4;w(4,2)=5;
   w(4,1)=1.2;w(4,5)=6.7;
   w(5,1)=9.2; w(5,6)=15.6; w(5,4)=6.7;
   w(6,2)=3.1;w(6,3)=4;w(6,5)=15.6; 
   w(7,1)=0.5;w(7,2)=2;w(7,3)=1.5; 
   
   [d,DD]=dijkstra(w,7)    %计算节点7到其他各点的最短路,及路径上的点
 
 
计算结果如下:
 
d =
 
    0.5000    2.0000    1.5000    1.7000    8.4000    5.1000         0
 
 
DD =
 
     0     0     3     0     0     0     2
     0     0     0     5     0     6     0
     3     0     0     4     0     0     0
     0     5     4     0     0     0     0
     0     0     0     0     0     7     0
     0     6     0     0     7     0     0
     2     0     0     0     0     0     1