就这?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是正确的。