离散数学(第五版) 迪杰斯特拉(Dijkstra)算法计算图画法流程

迪杰斯特拉算法是一种用于求解带权图中某一点到其余点最短路径的算法。
先讲其理论论述,再展示实践的事例。(二者可能有些步骤顺序的出入,最好通过实践去理解理论思想)

其基本思想为:
1、以出发点初始化点的集合A
2、以未在A集合中的所有点为B集合
3、找出A集合的所有点(依次取A中的点)到B集合中所有点(对于某一个A中的点,依次对B中的点进行判断)直接相连的情况(记录相连边的权+A中当前匹配的点到v0(起点)点的最短路径),记录A中的端点。(*可简化)
4、比较路径后,找出B中可到达起点的最短路径(权最小)的点k,标记此路径。
5、将k从B中移去,加入A。
6、重复3-5直到B中无点。
7、每一个被标记的路径,都是起点到该点的最短路径。
*可简化处为,因为每一次都将可达路径列出,则当新的点进入A时不需要再对原来的点进行求路径,仅需对新加入的点进行路径判断即可。

实践事例
以课本上的图为例(可能与上文的描述顺序有些出入,最好以下文的顺序理解上文)
此处为题
例 (无向带权图)
问题:求从v0到其它各点的最短路径。
离散数学(第五版) 迪杰斯特拉(Dijkstra)算法计算图画法流程_第1张图片

初始化解释
初始化:开始时,将起点视作v0-v5之外的一个其它点“λ",它到v0(图中起点)的距离(权)为0,到其余各点的权为无穷大。此时视λ为A中的点(但若需列出A中的点时不写λ,其应该是用于初始化的一个辅助点(引出真正的图中起点v0),用于统一操作(个人观点))。
第一步
写出A中的点(此时A中只有λ)到B中各点的仅包含一条边的路径(直接相连),若其可达则记录其权值与此边于A中的端点,例(0,λ),若不可达,则写上(∞,λ)。发现λ与v0之间的边是最短的,于是标记这一条边。标记此边于B中的端点v0并将其加入A。
离散数学(第五版) 迪杰斯特拉(Dijkstra)算法计算图画法流程_第2张图片

第二步
因为第一步时已经列出λ到其它各点的可达路径的长短了,于是不需要从λ开始对A中的点进行依次取边了,直接找新加入的点v0(新加入的顶点,每次不一样,这次是v0)到B中其余各点的路径边的权(到不了当作无穷),若可到,则记录从图中起点到B中该点的权值之和与当前正在比对的A中点
(举个例子,若当前正在进行比对的点是v3,与它存在边的点是v5,那么,当前应该记录v5通过v3到达v0的最短路径长度(v3到v5的边的权+v3到起点的最短路径(v3与A中与它相连的最短的边的权+那条边的另一个端点到起点的最短路径,依次类推)),与v3此点)
在本轮寻路中,当前点是v0,则记录为(n1,v0)格式(n1为代指,v0为当前点)。则将由v0取出的点与λ(A中之前的所有的列出路径的点)的路径(此处不包括已经加入A的B中点,例若B中到v3的路径已经与上一轮被标记了,则其不参与此轮比较)比大小,若v0的路径大则舍弃,否则用其替换λ的路径。
全部比完后,选出当前未标记的B中的点到A中点的最短路径,标记它。将它于B中的端点加入A。

第三步
同理,以新加入A的点为当前点,寻找其于B中直接相连的点中到起点的权值和最短的路径并于其它路径比较,比较过程同上,大则舍弃,小则替换。将新的点加入A

重复步骤,结果如图所示
离散数学(第五版) 迪杰斯特拉(Dijkstra)算法计算图画法流程_第3张图片
离散数学(第五版) 迪杰斯特拉(Dijkstra)算法计算图画法流程_第4张图片
标记的地方代表,起点到标记点列的点的最短路径的长度。

v0(起点)到v3的最短路径的长度(权值和)为7。其路径为v3->v4(v3标记的另一个点)->v2(v4标记的另一个点)->v1(v2同左)->v0(v1同左)

你可能感兴趣的:(离散数学(第五版) 迪杰斯特拉(Dijkstra)算法计算图画法流程)