MATLAB图论合集(三)Dijkstra算法计算最短路径

本贴介绍最短路径的计算,实现方式为迪杰斯特拉算法;对于弗洛伊德算法,区别在于计算了所有结点之间的最短路径,考虑到MATLAB计算的便捷性,计算时只需要反复使用迪杰斯特拉即可,暂不介绍弗洛伊德的实现


迪杰斯特拉算法的思想,通俗的归纳来说就是:从当前结点出发,寻找一个未与当前简历连接------且路径最小的点作为下一个寻找到的地址。有关结点是否建立连接,需要一个如下的矩阵来辅助记录。

若还未建立连接,则将前驱标记为-1,距离记录为无穷~

至于Distance内,存放的是起点到当前结点的最短距离,这一距离可能会不断更新,直到寻找到最短的路径为止~

实现的具体底代码:

  • 第一种:
Matlab 复制代码
[P,d] = shortestpath(G, 9, 4)

如上代码中,P表示的9与4节点之间最短路径经过的结点,而d保存的是最短路径值的总和~

  • 第二种:
Matlab 复制代码
D = distances(G);
D(1,2);
D(9,4);

如上代码中,D是一个存储了任意两结点之间最短路径的矩阵,通过索引访问的方式,即可求出任意两点的最短路径~

此外,如下是计算求出指定节点指定距离内部的全部结点的实现方式:

Matlab 复制代码
[nodeIDs,dist] = nearest(G, 2, 10); 

注意,上述几个函数从2017a版本后才能全部使用

如下是创建图并计算图的具体实现方式:

Matlab 复制代码
s = [9 9 1 1 2 2 2 7 7 6 6  5  5 4];
t = [1 7 7 2 8 3 5 8 6 8 5  3  4 3];
w = [4 8 3 8 2 7 4 1 6 6 2 14 10 9];
G = graph(s,t,w);
Matlab 复制代码
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 

set( gca, 'XTick', [], 'YTick', [] );

[P,d] = shortestpath(G, 9, 4);

myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2); 
highlight(myplot, P, 'EdgeColor', 'g') ; 

结果如下,绿色即为最短路径:

相关推荐
旖-旎1 分钟前
《LeetCode 646 最长数对链 || LeetCode 1143 最长公共子序列》
c++·算法·leetcode·动态规划
Frostnova丶20 分钟前
(15)LeetCode 189. 轮转数组
数据结构·算法·leetcode
Lumos1861 小时前
故障保护与鲁棒性(十七)
算法
手写码匠1 小时前
从零实现大模型推理引擎:Continuous Batching 与动态调度系统深度解析
人工智能·深度学习·算法·aigc
wabs6661 小时前
关于单调栈【力扣503.下一个更大元素II的思考】
算法·单调栈
c238561 小时前
下篇:伸缩魔法!进阶吃透可变滑动窗口篇
c++·算法
186******205311 小时前
RuView 新手快速上手与实战指南
算法
txzrxz1 小时前
关于二维/多维前缀和
算法
来一碗刘肉面2 小时前
顺序表的按值查找
数据结构·c++·算法
zzz_23682 小时前
【Java实习面试算法冲刺】图论
java·算法·面试