1.Dijkstra算法
Dijkstra算法主要用于解决带权重的有向图。其权重只能是正值,不能解决负值问题,其基本思想是利用广度优先搜索的方法,更新起点到各个顶点的最短距离。是一种经典的求单源最短路径的一种方法。其具体做法是定义一个数组
1为源点,定义数组T
S中存入源点1,选取离源点1最近的顶点3,将3存入数组S中,(图所有的边都是正数,所以不存在更近的到3顶点的路线)。找到顶点3能到达的顶点。
可以看出3->2的距离为3,1->3的距离为2,1->3->2的距离为2+3=5,小于6更新T中的2为5。3->4的距离为5,1->3->4=2+5=7。更新数组T:
选取下一个最短路径且不在数组S中的顶点,如上表可知顶点2的距离最短,将顶点2加入到数组S中,遍历顶点2能到达的顶点
2->4的距离为1,1->2->4的距离为5+1=6,小于之前的7,更新数组T:
至此,得到各订=顶点的最短路径。
以下图[1]为例编写matlab代码:
function
d=[inf,inf,10,inf,30,100;
inf,inf,5,inf,inf,inf;
inf,inf,inf,50,inf,inf;
inf,inf,inf,inf,inf,10;
inf,inf,inf,20,inf,60;
inf,inf,inf,inf,inf,inf];
带入函数中进行测试得到:
a: []
b: []
c: [1 3]
d: [1 5 4]
e: [1 5]
f: [1 5 4 6]
1->3, 1->5->4, 1->5, 1->5->4->6。
2.Floyd算法
前面介绍的Dijkstra算法可以很好的求解单源权重的路径规划问题,但是当权重存在负数时,则不能很好的解决,对于带负权重边(不存在负权回路)的问题可以应用Floyd算法进行求解。其是一种经典的求多源最短路径的一种方法。Floyd的原理在以下博客中有详细介绍。
https://blog.csdn.net/qq_35644234/article/details/60875818blog.csdn.netmatlab代码如下:
function
继续上一个例子:
求出:
d =Inf Inf 10 50 30 60
Inf Inf 5 55 Inf 65
Inf Inf Inf 50 Inf 60
Inf Inf Inf Inf Inf 10
Inf Inf Inf 20 Inf 30
Inf Inf Inf Inf Inf Inf
r = 1 2 3 5 5 5
1 2 3 3 5 3
1 2 3 4 5 4
1 2 3 4 5 6
1 2 3 4 5 4
1 2 3 4 5 6
当要输出1->6的路径时调用函数:
DisplayPath(r, 1, 6)
输出为:
V1 -> V5 -> V4 -> V6
参考
- ^https://blog.csdn.net/qq_35644234/article/details/60870719