文章目录
Dijkstra 算法图解
我们拿上图进行讲解
首先我们先定义3个数组用来存放我们需要的信息
S数组简单来讲:
就是一个标志位,如果已经求过他的最短路径的话,将这个数组对应的值至一,否则则为零
P数组简单来讲:
就是存放他前驱节点,如假设我们的最短路径是 1 5 7这三个节点 ,则7节点的前驱是5,5节点的前驱是1
D数组简单来讲:
就是存放权值/最短路径,也就是两个顶点之间的数字,如假设顶点1到7的最短路径是14,1到5的最短路径就是14 + 8 = 22
那根据以上信息我们先进行个初始化,可以根据下列表格进行一个直观的观测
为了方便展示,我们顶点1234567 用V1234567来进行表示,同时我们一开始用的是节点1开始进行初始化
V1 | V2 | V3 | V4 | V5 | V6 | V7 | |
---|---|---|---|---|---|---|---|
S(标志位) | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
P(前驱节点) | -1 | 0 | -1 | -1 | -1 | 0 | 0 |
D(最短路径总数) | 0 | 12 | ∞ | ∞ | ∞ | 16 | 14 |
表格说明:
P(前驱节点),这里你可以理解用数组的方式来进行表示,1234用数组来进行表示来说就是a[0]=1,a[1]=2…,也就是0123
同时V1节点 与V345都不接通,所以为了表示他们两之间没有最短路径,我们用∞这个符号来表示,而v267,则都有最短路径,同时他们的前驱都是V1,所以都是P中的节点数都是0,而V1345的前驱节点我们也可以设置成未知-1(后续会进行更新,所以这个无所谓的,但为了方便管理我们这样设置而已)
之后我们先根据D中最短的路径,也就是V2开始,进行下一步的遍历
V1 | V2 | V3 | V4 | V5 | V6 | V7 | |
---|---|---|---|---|---|---|---|
S(标志位) | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
P(前驱节点) | -1 | 0 | 1 | -1 | -1 | 0 | 0 |
D(最短路径总数) | 0 | 12 | 22 | ∞ | ∞ | 16 | 14 |
表格说明:
我们从 v2开始的话,是可以到达V3和V6的,我们先从 v3开始讲起。首先我们经过 v3的话,那么它的前驱节点 p 则为 v2,那我们的 p 中它的前驱节点中的数就为1。然后它的最短路径数 d 那就是由节点1到节点3开始算起,也就是12+10等于22,由于一开始我们 v3的最短路径总数就是正无穷,22比正无穷小,那么它最短路径总数就是更新成22。
我们 v2也是可以到达 v6的,我们可以先计算它最短路径总数,那它的最短路径总数就是12+7=19,然后我们在与 v6中的最短路径总数进行对比,发现19是比16大的,那么它最短路径总数我们就选择不更新
之后我们的 v2就开始遍历完了之后我们再根据它最短路径总数最小,同时标志位为零的去寻找.之后就开始V7
V1 | V2 | V3 | V4 | V5 | V6 | V7 | |
---|---|---|---|---|---|---|---|
S(标志位) | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
P(前驱节点) | -1 | 0 | 1 | -1 | 5 | 0 | 0 |
D(最短路径总数) | 0 | 12 | 22 | ∞ | 22 | 16 | 14 |
表格说明:
由于我们现在便历到 v7节点,那么 v7节点的标志位就开始至一。
那我们看可以看到 v7节点,它是可以到V6和V5的,我们先看 v7到 v5.
v7到 v5的话,也就是节点一到节点五,那么它的最短路径就是14+8等于22,由于之前 v5节点的最短路径总数大小为正无穷,那22是比正无穷要短的那我们选择将 v5节点进行一个更新,同时也更新它的前驱节点数为6,也就是V7节点
同时我们可以看到 v7也是可以到达 v6的节点的,那么 v7到 v6,也就是 v 一到 v7,再到 v6的这个距离由14+9等于23。那 v6节点它现在的最小路径总数是16,那16是比23的,所以我们选择不更新
之后我们根据它标志位以及它最小路径总数,我们开始寻找 v6的后继节点
V1 | V2 | V3 | V4 | V5 | V6 | V7 | |
---|---|---|---|---|---|---|---|
S(标志位) | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
P(前驱节点) | -1 | 0 | 1 | -1 | 5 | 0 | 0 |
D(最短路径总数) | 0 | 12 | 22 | ∞ | 18 | 16 | 14 |
表格说明:
同理,我们遍历到 v6节点的时候呢,先将它的标志位至1,同时v6节点也是可以到 v3和 v5节点的
那 v3节点的话就是 v 一到 v6到 v3,那它的总长度还是22。那我们在查看 v3节点,它的最短路径总数也同样是22,那么这次选择是不更新,因为它这个是相同的节点。
之后我们再看 v5节点,那它是 v 一到 v6到 v5,那它的总长度是18。那由于我们之前 v5节点的它的最短路径总数,它是22,那么18是比22小的,那我们选择更新
之后我们到了 v5节点
V1 | V2 | V3 | V4 | V5 | V6 | V7 | |
---|---|---|---|---|---|---|---|
S(标志位) | 1 | 1 | 0 | 0 | 1 | 1 | 1 |
P(前驱节点) | -1 | 0 | 1 | 4 | 5 | 0 | 0 |
D(最短路径总数) | 0 | 12 | 22 | 22 | 18 | 16 | 14 |
表格说明:
那 v5节点它是可以到 v3与 v4节点的,那我们看 v5到 v3节点的最短路径是18,加上五等于23,那么它是与 v3的最短路径总数是要大的。所以我们选择不更新。那到了 v4节点的话,那它是18加上四等于22,那它是比正无穷要小的。那我们这次选择更新它的最短路径总数
那我们接下来看 v3节点
V1 | V2 | V3 | V4 | V5 | V6 | V7 | |
---|---|---|---|---|---|---|---|
S(标志位) | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
P(前驱节点) | -1 | 0 | 1 | 4 | 5 | 0 | 0 |
D(最短路径总数) | 0 | 12 | 22 | 22 | 18 | 16 | 14 |
表格说明:
v3节点它只可以到 v4节点,那它的最短路径总数就是 v3的最短路径总数22,加上它的最短路径总数三那是等于25的那与我们 v4节点,现在的最短路径总数是22要大的。所以我们选择不更新。
之后,那我们再看到 v4节点,v4节点是最后一个更新的,那么它是由于是最后一个节点,那我们直接就是没有任何最短路径总数了,那我们直接将它标志位给至一就行了。于是我们的这个算法的所有图解就已经完成了。那它是由局部影响全局来进行的
往期回顾
1.【第一章】《线性表与顺序表》
2.【第一章】《单链表》
3.【第一章】《单链表的介绍》
4.【第一章】《单链表的基本操作》
5.【第一章】《单链表循环》
6.【第一章】《双链表》
7.【第一章】《双链表循环》
8.【第二章】《栈》
9.【第二章】《队》
10.【第二章】《字符串暴力匹配》
11.【第二章】《字符串kmp匹配》
12.【第三章】《树的基础概念》
13.【第三章】《二叉树的存储结构》
14.【第三章】《二叉树链式结构及实现1》
15.【第三章】《二叉树链式结构及实现2》
16.【第三章】《二叉树链式结构及实现3》
17.【第三章】《二叉树链式结构及实现4》
18.【第三章】《二叉树链式结构及实现5》
19.【第三章】《中序线索二叉树理论部分》
20.【第三章】《中序线索二叉树代码初始化及创树》
21.【第三章】《中序线索二叉树线索化及总代码》
22【第三章】《先序线索二叉树理论及线索化》
23【第三章】《先序线索二叉树查找及总代码》
24【第三章】《后续线索二叉树线索化理论》
25【第三章】《后续线索二叉树总代码部分》
26【第三章】《二叉排序树基础了解》
27【第三章】《二叉排序树代码部分》
28【第三章】《二叉排序树代码部分》
29【第三章】《平衡二叉树基础概念》
30【第三章】《平衡二叉树的平衡因子》
31【第三章】《平衡二叉树的旋转基础详解》
32【第三章】《平衡二叉树的旋转类型图文详解》
33【第三章】《平衡二叉树的旋转类型总结及总代码》
34【第三章】《哈夫曼树简单了解》
35【第三章】《哈夫曼树的构造方法》
36【第三章】《哈夫曼编码构造及代码》
37【第四章】《图的定义》
38【第四章】《图的基本概念和术语》
39【第四章】《图的存储结构》
40【第四章】《图的遍历之深度优先遍历》
41【第四章】《广度优先遍历BFS》
42【第四章】《图的遍历总代码》
43【第四章】《最小生成树概念》
44【第四章】《最小生成树的应用举例》
45【第四章】《prim算法(普里姆算法)详解》
46【第四章】《prim算法(普里姆算法)详解2》
47【第四章】《prim算法(普里姆算法)详解3》
48【第四章】《prim算法(普里姆算法)讲解汇总》
49【第四章】《prim算法(普里姆算法)代码讲解》
50【第四章】《prim算法(普里姆算法)总代码》
51【第四章】《克鲁斯卡尔算法思路介绍》
52【第四章】《克鲁斯卡尔算法步骤思路1》
53【第四章】《克鲁斯卡尔算法步骤思路2》
54【第四章】《克鲁斯卡尔算法应用场景-公交站问题》
55【第四章】《克鲁斯卡尔算法判断回路问题》
56【第四章】《克鲁斯卡尔算法步骤回顾》
57【第四章】《克鲁斯卡尔算法代码初始化详解》
58【第四章】《克鲁斯卡尔算法总代码详解》
59【第四章】《了解最短路径》
60【第四章】《迪杰斯特拉算法了解》