两点顶点之间最短路径问题
基于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
总结
互相学习 共同进步