1.根据带权邻接矩阵生成无向图(inf表示无穷大)
w=[0,12,inf,inf,inf,16,14;
12,0,10,inf,inf,7,inf;
inf,10,0,3,5,6,inf;
inf,inf,3,0,4,inf,inf;
inf,inf,5,4,0,2,8;
16,7,6,inf,2,0,9;
14,inf,inf,inf,8,9,0];
w(w==inf)=0;%将矩阵中的inf变为0
G=graph(w);%根据带权邻接矩阵生成无向图
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2); %画图
输入参数说明:
w:邻接矩阵,存储各顶点之间的距离值,是一个大小为顶点个数的方阵,对角线元素为0
strat:起点编号
finish:终点编号
输出参数说明:
distance:最短路径对应的距离
path:为从start到finish的最短路径
2.算法有效性测试:
计算1点到4点的距离:
在开始计算之前将起点1以外的顶点label均设置为无穷大(即节点1到其他节点的距离为无穷大)
第一列为节点label,第二列为节点1到其他点的距离,第三列为顶点集s
1 | 0 | |
2 | ∞ | / |
3 | ∞ | / |
4 | ∞ | / |
5 | ∞ | / |
6 | ∞ | / |
7 | ∞ | / |
第一轮迭代开始(label(6)=∞)
以1为起点,进行第一轮搜索与1相邻的节点分别有2,6,7。对于1的相邻节点6来说,1的label(1)=0,连接边的代价为16。很明显label(6)>(label(1)+w(1,6)),那么我们就将6的label(6)更新为16,6的父节点更新为1。同样的道理,label(2)更新为12,label(7)更新为14。
1 | 0 | |
2 | 12 | 1 |
3 | ∞ | |
4 | ∞ | |
5 | ∞ | |
6 | 16 | 1 |
7 | 14 | 1 |
第二轮迭代开始(label(5)=∞)
以6为起点进行搜索,与6相邻的节点分别有3,5。对于6的相邻节点5来说,6的label(6)=16,连接边的代价为2。很明显label(5)>(label(6)+w(6,5)),那么我们就将5的label(5)更新为18,5的父节点更新为6。同样的道理,label(3)更新为22。
1 | 0 | |
2 | 12 | 1 |
3 | 22 | 2 |
4 | ∞ | |
5 | 18 | 6 |
6 | 16 | 1 |
7 | 14 | 1 |
第三轮迭代开始(label(4)=∞)
以5为起点进行搜索,与5相邻的节点有4。对于5的相邻节点4来说,5的label(5)=18,连接边的代价为4。很明显label(4)>(label(5)+w(5,4)),那么我们就将4的label(4)更新为22,4的父节点更新为5。
1 | 0 | |
2 | 12 | 1 |
3 | 22 | 2 |
4 | 22 | 5 |
5 | 18 | 6 |
6 | 16 | 1 |
7 | 14 | 1 |
迭代结束:
按倒序结果推出最短路径path
并输出最短距离Distance
*代码输出效果展示:
需要代码请点击:https://download.csdn.net/download/weixin_44647430/86753167