MATLAB实现Dijkstra最短路算法的一个例子

本人matlab小白,如有错误,希望大家批评指正。

本例子来源于司守奎老师《数学建模算法与应用》

算法如下:

例子:
  书中已给出matlab程序,本人在此将自己的注释附上,供大家参考,并在提出一个问题与自己的分析:
clc,clear
a=zeros(6);%设置一个6*6的矩阵(邻接矩阵)
a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;
a(2,3)=15;a(2,4)=20;a(2,6)=25;
a(3,4)=10;a(3,5)=20;
a(4,5)=10;a(4,6)=25;
a(5,6)=55;%上三角矩阵元素
a=a+a';%邻接矩阵为对称阵
a(find(a==0))=inf;%其余元素,包括对角线元素设为无穷大
pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a));
d(1:length(a))=inf;d(1)=0;temp=1;%第一次标号,temp为当前向外探查的点
while sum(pb)<length(a)%所有点都被标记为止
    tb=find(pb==0);%找出未被标记的点
    d(tb)=min(d(tb),d(temp)+a(temp,tb));%由第一点向外探查,暂时记下其余点的最短路
    tmpb=find(d(tb)==min(d(tb)));%T集合中最小的点,可能不止一个
    temp=tb(tmpb(1));%更新探查点
    pb(temp)=1;%已被标记
    index1=[index1,temp];%标号顶点顺序
    temp2=find(d(index1)==d(temp)-a(temp,index1));%找标记点的前一个点,可能不止一个
    index2(temp)=index1(temp2(1));
end
d, index1, index2

 

脚本执行结果如下:
问题是:
temp2=find(d(index1)==d(temp)-a(temp,index1))一句中a(temp,index1)为何不是a(index1,temp)?若变换则报错,超出矩阵维度。
思考:
为此,我在命令窗口,进行如下实验:
  可见,问题在于a(temp,index1)为行向量,a(index1,temp)为列向量。所以亦可将d(index1)改为d(index1)',将其从行向量改为一列向量。即:

    temp2=find(d(index1)'+a(index1,temp)==d(temp));%找标记点的前一个点,可能不止一个
运行结果一样。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值