- 2
- 0
- 约1.59千字
- 约 2页
- 2021-12-10 发布于福建
- 举报
Dijkstra 算法的 Matlab 实现
Glorevo?
在学习了 Dijkstra 算法之后,发现书上那堆代码写得跟坨 * 一样,越看越
恶心,强忍着看了一半,放弃了,干脆自己写吧!
function [D I] = dijkstra(W,k)
% Dijkstra 算法 —— by Glorevo
% 找出赋权图第 k 个顶点到其余各个顶点的最小权以及最短路
% W 为带权邻接矩阵
% 返回值 D 为最小权, I 为最短路
n = size(W,1); % 顶点个数
V = 1:n; % 初始化待作为终点的顶点向量
V(k) = 0; % 0 表示不再作为终点
temp = k; % 当前插入顶点
D(1:n) = inf; % 初始化最小权向量
D(k) = 0; % 顶点 V(k) 到本身的权为 0
I(1:n) = k; % 初始化最短路向量
while sum(V) 0 % 尚存在可作为终点的顶点,则继续迭代
v = find(V~=0); % v 是可作为终点的顶点向量,用作循环变量的
取值范围
for i = v % 分别以 v 中所有的顶点作为终点,插入一个
顶点 temp
if D(i) D(temp)+W(temp,i) % 判断是否比之前更优
D(i) = D(temp)+W(temp,i); % 保存更小权,更新最小权向量
I(i) = temp; % 修改当前路径的终点的前驱
end
end
% 在可作为终点的顶点向量 v 中找到当前使 D 最小的顶点
curmin = find(D==min(D(v)));
for j = 1:length(curmin) % 因为以上找到的顶点可能有多个,这
里只取一个
if (any(curmin(j)==v))
% 不能直接用 temp=curmin(1) 或者 temp=curmin(2) 之类的表达
% 因为 curmin(1) 等可能只是 D 却不是 v 的一个合法索引!
temp = curmin(j);
break ; % 将当前使 D 最小的顶点作为下次迭
代的插入顶点
end
end
V(temp) = 0; % 将当前使 D 最小的顶点标记为不可再
作为终点
end
您可能关注的文档
最近下载
- 中药新药注册药学申报资料.ppt VIP
- 中药注册技术要求及申报资料.pptx VIP
- 中药注册分类及申报资料要求.doc VIP
- 第11课 中国古代的民族关系与对外交往 高二上学期历史统编版(2019)选择性必修1国家制度与社会治理.pptx VIP
- 中药注册分类及申报资料要求国家药监局2020年第68号通告.pdf
- 第11课 中国古代的民族关系与对外交往 课件-高二上学期历史统编版(2019)选择性必修1国家制度与社会治理.pptx VIP
- 中药注册分类及申报资料要求(国家药监局2020年第68号通告).pdf VIP
- 2025年山东省聊城市中考生物真题(含答案)原卷.pdf
- 第11课 中国古代的民族关系与对外交往 课件(共56张PPT)-高二上学期历史统编版(2025)选择性必修1国家制度与社会治理(含音频+视频).pptx VIP
- 第11课 中国古代的民族关系与对外交往 课件(共24张PPT)(含音频+视频).pptx VIP
原创力文档

文档评论(0)