Dijkstra算法的Matlab实现宣贯.pdfVIP

  • 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

文档评论(0)

1亿VIP精品文档

相关文档