两点顶点之间最短路径问题

两点顶点之间最短路径问题

基于matlab的dijkstra算法


前言

看了很多篇介绍dijkstra算法的博客,没发现对于程序来说很多的地方都有问题。

一、函数代码

代码如下(示例):

function [ mydistance,mypath] = mydijkstra( a,st,en )
%DIJK Summary of this function goes here
%   W  权值矩阵   st 搜索的起点   en 搜索的终点
    n = length(a);
    visited(1:n) = 0;         %记录下是否看过该点
    distance(1:n) = inf;      %默认距离标记为无穷
    parent(1:n) = 0;          %达到最小路径的前一个节点
    visited(st) = 1;          %自身标记为已看
    distance(st)=0;           %自身距离标记为0
    u = st;                   %第一次循环中采用起点为初始点
    for i = 1:n-1             %排出自身一个点的循环次数
        id = find(visited==0);%找出没看过的点的标号
        for v = id            %逐个看
          if distance(u) + a(u,v) < distance(v)   %判断从u到v是不是比本来到达v的路径要短
              distance(v) =  distance(u) + a(u,v);%从u到v比本来到达v的路径要短,更新最小路径
              parent(v) = u;  %标出这次遍历中发现到达v的最短路径对于的前节点u
          end
        end
        temp = distance;      %暂存距离
        temp(visited ==1)=inf;%在暂存值里面把作为前节点遍历过的点所需到达的距离标无穷
        [p,u]=min(temp);      %判断没作为前节点的节点中的最短距离
        visited(u) =1;        %u是表示最小项的序号,从当前发现的最短距离中开始新的遍历
    end
    mypath=[];                %留个内存
    if parent(en)~=0           %判断一下是否可以到达终点
        p=en;                  %可以到达终点则保留下到达终点的前节点
        mypath = [en];         %记录下路径(先是终点)
        while p ~= st         %判断一下前节点是否就是起点
            p = parent(p);    %不是起点,则再读该前节点的前节点
            mypath = [p mypath];%记录下路径           
        end
    end
    mydistance =distance(en);  %显示起点到终点的最短距离
end

2.执行代码

代码如下(示例):

clc;
W = [ 0   6   3 Inf Inf Inf;
      6   0   2  5  Inf Inf;
      3   2   0  3   4  Inf;
     Inf  5   3  0   2   3;
     Inf Inf  4  2   0   5;
     Inf Inf Inf 3   5   0;];
 [ mydistance,mypath] = mydijkstra( W,1,2 );
 mydistance,mypath

总结

互相学习 共同进步

  • 2
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值