1、什么是Dijkstra算法
杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
2、Dijkstra算法介绍
算法特点:迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。
3、 单源最短路径问题
例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径。
(顶点之间连线方框里的数字表示两点之间的距离,例如1——>2顶点之间的距离为1;2——>3之间的距离为9)
首先我们使用二维数组e来储存顶点之间边的关系,e1即表示1、2两顶点之间的权数(距离),现初始值如下,各顶点之间没有直接路径的我们表示为无穷大,自身顶点之间即e1=0。
然后我们用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下:
我们将此时dis数组中的值称为最短路径路程的“估计值”。通过dis数组可知当前离一号顶点最近的是2号顶点。当选择了2号顶点后,dis2的值就已经从“估计值”变成了“确定值”,即1号顶点到2号顶点的最短路程就是当前dis2的值。
接下来再看2号顶点有哪些出边,有2——>3和2——>4这两条边。先讨论通过2——>3这条边能否让1号顶点到3号顶点的路程变短,也就是说现在来比较dis3和dis2+dis2的大小。
由图表可知dis3=12,dis2+e2=10,因此dis3更新为10.这个过程的专业术语叫做“松弛”,1号顶点到3号顶点的路程即dis3,通过2——>3这条边松弛成功。这便是Dijkstra算法的主要思想:通过“边”来松弛1号顶点到其余各个顶点的路程。
同理,通过2——>4(e2)可将dis4更新为4。
刚才我们对2号顶点所有的出边进行了松弛,松弛之后的dis数组更新为:
继续对剩下的3、4、5和6号顶点中,选出离1号顶点最近的顶点。通过上面更新过的dis数组,当前离1号顶点最近的是4号顶点。此时,dis4的值已经从“估计值”变为了“确定值”。下面继续对4号顶点的所有出边(4——>3,4——>5和4——>6)用刚才的方法进行松弛。
松弛完毕之后的dis数组为:
然后在剩下的3、5、6号顶点中,选出离1号顶点最近的顶点,这次选择3号顶点,此时dis3的值已经从“估计值”变为了“确定值”。对3号顶点的所有出边(3——>5)进行松弛。
松弛完毕之后的dis数组为:
继续在剩下的5号和6号顶点中,选出离1号顶点最近的顶点,这次选择5号顶点。此时dis[5]的值已经从“估计值”变为了“确定值”。对5号顶点的所有出边(5——>6)进行松弛,松弛之后更新的数组为:
最后对6号顶点的所有出边进行松弛,因为这个例子6号顶点没有出边,因此不用处理。到此,dis数组中所有的值都已经从“估计值”变为了“确定值”。
最终dis数组如下,这便是1号顶点到其余各个顶点的最短路径。
OK,算法的基本思想是:每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点其余所有点的最短路径。基本步骤如下:
*1、 将所有的顶点为分为两部分:已知最短路程的顶点集合p和未知最短路径的顶点集合Q。最开始,已知最短路径的顶点集合p中只有源点一个顶点。我们这里用一个book数组来记录那些点在集合p中。例如对于某个顶点i,如果book[i]为1则表示这个顶点在集合p中,如果book[i]=0则表示这个顶点在集合Q中。
2、 设置源点s到自己的最短路径为0即dis[s]=0。若存在有源点能直接到达的顶点i,则把dis[i]设为e[s][i]。同时把所有其它(源点不能直接到达的)顶点的最短路径设为∞。
3、 在集合Q的所有顶点中选择一个离源点s最近的顶点u(即dis[u]最小)加入到集合p。并考察所有以点u为起点的边,对每一条边进行松弛操作。例如存在一条从u到v的边,那么可以通过将边u——>v添加到尾部来拓展一条从s——>v的路径,这条路径的长度是dis[u]+e[u][v]。如果这个值比目前已知的dis[v]的值要小,我们可以用新值来替代当前的dis[v]中的值。
4、 重复第3步,如果集合为空,算法结束。最终dis数组中的值就是源点到所有顶点的最短路径。*
完整的Dijkstra算法代码如下:
可以输入以下数据进行验证。第一行两个整数n和m。n表示顶点个数,m表示边的条数。接下来m行,每行有3个数xyz,表示顶点x到顶点y边的权值z
n=6 m=9
x y z
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。因此在实际生活中应用相当广泛,大到国家各城市道路之间的道路网络建设,快递公司基于最短距离改进优化问题算法的物流配送系统,小到我们个人出行路线方案的选择。无论是个人还是公司,我们对Dijkstra算法思想的有意识应用,在解决单源路径问题上都给了我们新思路,提升了社会的运作效率。
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务