就这?Dijkstra算法这么简单?(递归)

就这?Dijkstra和Floyd算法这么简单?(递归)

Dijkstra简介

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。
在这里插入图片描述
上面是算法的流程图,如果读者觉得不是那么好理解的话,那么笔者展示一个例子,大家就能清楚了解这个过程了。
题目:从节点v1到节点v5,寻找一条最短的路径。
在这里插入图片描述

算法与思路

首先,比如我们从v0节点出发,要找到到达v5的最短路径。此时,我们把v0设作起点,遍历v0所能到达的节点,记录距离最短的节点,然后以此为出发点,继续遍历,知道到达v5为止,这路上的路程的总和就算最短路径的长度。大家也可以参照流程图的解释来理解。

因为每当新确立一个起点之后,就重复之间的步骤,当循环到目的地时就退出,这与递归的思想很类似,故笔者用递归来实现。

当然这里的前提是对应的点之间存在通路。这里举的例子是无向图,有向图的算法思想也大致相同,只是实现起来有一点点小的差异,但是总体的思路是一样的。大家如果有什么疑惑也大可在评论区留言,笔者知无不言,与大家共同讨论共同进步。

话不多说,看Matlab代码(用其他软件实现也是大同小异的):

代码

% Dijkstra算法
global record;
global M
M = [0 1 4 1000 1000 1000
    1 0 2 4 5 1000
    4 2 0 1000 1 1000
    1000 7 1000 0 3 2
    1000 5 1 3 0 6
    1000 1000 1000 2 6 0];
start = 1;  % 起始点
global destination; % 目的地
destination = 6;
record = zeros(1,6);
s = 0;      % 路程
[start,s] = dijkstra(start,s);

function [start,s] = dijkstra(start,s)
% Dijkstra算法
global record;
global M
global destination
temp = s;
k = 0;
tip = start;
for i = 1:6
    if M(start,i) ~= 1000 && s+M(start,i) < 1000 && k ==0 && record(i) == 0
        temp = s + M(start,i);
        k = 1;
        tip = i;
    end
    if M(start,i) ~= 1000 && s+M(start,i) < 1000 && record(i) == 0
        if temp > s + M(start,i)
            temp = s + M(start,i);
            tip = i;
        end
    end
end
record(tip) = 1;
s = temp;
start = tip;
if start == destination
    disp("the result is")
    s
else
    [start,s] = dijkstra(start,s);
end

当然这里的数据只是对应于这个题目的,对于其他情况读者可以更换一下参数,或是将代码再改进一下即可哦。代码写的不是很好,请读者多指教哦。
下面是Matlab的运行结果:
在这里插入图片描述
读者自己也可以手算一下结果,s=9是正确的。

在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原创小白变怪兽

帮助原创小白成为怪兽吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值