手写matlab的迪杰斯特拉(dijkstra)算法的函数(注释很详细)

function [mydistance,mypath]=mydijkstra(a,sb,db)
%输入:a——邻接矩阵;a(i,j)——i到j之间的距离,可以是有向的
%sb——起点的标号,db——终点的标号
%输出:mydistance——最短路的距离,mypath——最短路径
%初始化
n=size(a,1); u=sb;
parent(1:n)=0; visited(1:n)=0;
distance(1:n)=inf;
distance(sb)=0;
visited(sb)=1;
for i=1:n-1
    id=find(visited==0);
    for v = id%这里的u更新的是路径的末端
        if distance(u)+a(u,v)<distance(v)%由于distance(u)是当前的最短的所以用来更新别的点
            distance(v) = distance(u)+a(u,v);
            parent(v)=u;%parent存的是前驱节点
        end
    end
    temp=distance;
    temp(visited==1)=inf;%已经标号的距离换成无穷
    [t,u]=min(temp);%找到标号值最小的顶点
    visited(u)=1;%标记已经标号的顶点
end
%上面的循环的得到的是起始点到其他点的最短路
%然后下面的程序用来提取起点到你想要的终点的最短路径
mypath = [];
if parent(db)~=0%如果存在路
    mypath = [db];
    t =db;
    while t~=sb
        p=parent(t);
        mypath = [p mypath];
        t=p;
    end
end
mydistance=distance(db);
end
  • 14
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Dijkstra算法是一种用于解决单源最短路径问题的经典算法,它可以找到从一个起点到其他所有节点的最短路径。下面是Dijkstra算法的基本步骤: 1. 创建一个距离数组dist[],用于存储起点到每个节点的最短距离。初始时,将起点的距离设置为0,其他节点的距离设置为无穷大。 2. 创建一个集合visited[],用于记录已经找到最短路径的节点。 3. 重复以下步骤,直到所有节点都被访问: a. 从未访问的节点中选择距离起点最近的节点,将其标记为visited。 b. 更新与该节点相邻的节点的最短距离。如果通过当前节点到达相邻节点的距离比之前记录的最短距离小,则更新最短距离。 4. 最终,dist[]数组中存储的就是起点到每个节点的最短距离。 在Matlab中实现Dijkstra算法,可以按照以下步骤进行: 1. 创建一个邻接矩阵来表示图的连接关系,其中矩阵元素表示两个节点之间的距离或权重。如果两个节点之间没有连接,则将对应位置的元素设置为无穷大。 2. 初始化dist[]数组,将起点的距离设置为0,其他节点的距离设置为无穷大。 3. 创建一个visited[]数组,用于记录已经找到最短路径的节点。 4. 重复以下步骤,直到所有节点都被访问: a. 从未访问的节点中选择距离起点最近的节点,将其标记为visited。 b. 更新与该节点相邻的节点的最短距离。如果通过当前节点到达相邻节点的距离比之前记录的最短距离小,则更新最短距离。 5. 最终,dist[]数组中存储的就是起点到每个节点的最短距离。 请注意,以上是Dijkstra算法的基本思路和步骤,具体实现可能会根据具体情况有所不同。在Matlab中,你可以使用循环和条件语句来实现算法的各个步骤。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值