Dijstra算法求一个点到另一个点之间的最短路径和距离

输入邻接矩阵

% weight=    [0     2     8     1   Inf   Inf   Inf   Inf   Inf   Inf   Inf;
%             2     0     6   Inf     1   Inf   Inf   Inf   Inf   Inf   Inf;
%             8     6     0     7     5     1     2   Inf   Inf   Inf   Inf;
%             1   Inf     7     0   Inf   Inf     9   Inf   Inf   Inf   Inf;
%           Inf     1     5   Inf     0     3   Inf     2     9   Inf   Inf;
%           Inf   Inf     1   Inf     3     0     4   Inf     6   Inf   Inf;
%           Inf   Inf     2     9   Inf     4     0   Inf     3     1   Inf;
%           Inf   Inf   Inf   Inf     2   Inf   Inf     0     7   Inf     9;
%           Inf   Inf   Inf   Inf     9     6     3     7     0     1     2;
%           Inf   Inf   Inf   Inf   Inf   Inf     1   Inf     1     0     4;
%           Inf   Inf   Inf   Inf   Inf   Inf   Inf     9     2     4     0;];
weight = [0 50 Inf 40 25 10;
    50 0 15 20 Inf 25;
    Inf 15 0 10 20 Inf;
    40 20 10 0 10 25;
    25 Inf 20 10 0 55;
    10 25 Inf 25 55 0];
for i = 2:6
    fprintf('c1到c%d的最近距离和路径如下:',i);
      [dis, path]=dijkstra(weight,1,i)
      fprintf('\n');
end
% weight为邻接矩阵
% 1 为起始点, i为终止点

结果截图

在这里插入图片描述

调用的函数

function [min,path]=dijkstra(w,start,terminal)
n=size(w,1); label(start)=0; f(start)=start;
for i=1:n
   if i~=start
       label(i)=inf;
end, end
s(1)=start; u=start;
while length(s)<n
   for i=1:n
      ins=0;
      for j=1:length(s)
         if i==s(j)
            ins=1;
         end,  
      end
      if ins==0
         v=i;
         if label(v)>(label(u)+w(u,v))
            label(v)=(label(u)+w(u,v)); 
         f(v)=u;
         end, 
      end, 
   end   
v1=0;
   k=inf;
   for i=1:n
         ins=0;
         for j=1:length(s)
            if i==s(j)
               ins=1;
            end, 
         end
         if ins==0
            v=i;
            if k>label(v)
               k=label(v);  v1=v;
            end,  
         end,  
   end
   s(length(s)+1)=v1;  
   u=v1;
end
min=label(terminal); path(1)=terminal;
i=1; 
while path(i)~=start
      path(i+1)=f(path(i));
      i=i+1 ;
end
path(i)=start;
L=length(path);
path=path(L:-1:1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值