最短路径问题之Dijkstra算法趣解

作为一枚算法小白,看了几篇大佬的博客,有些体会。
写这篇是为了记录自己对于Dijkstra算法理解,以及思考方式,也希望对其他小白能有些许的帮助。
还有其中一位大佬在博客中的一句前言,分享给大家,希望能给大家一点前行路上的动力。
最短路径问题—Dijkstra算法详解

在这里插入图片描述
下面就开始正文咯咯~

首先嘛,要学习算法,就得要了解它解决的是什么问题。

最短路径:从图中的某个顶点出发到达另外一个顶点的所经过的边的 权重和最小 的一条路径。
大家可以想象成:

某个人叫Dijkstra,身患重度懒癌,但却嗜吃如命,在原点(家中)的他,想知道到达其他各个美味铺子的最近的路线。
之后就可以告诉外卖小哥以便他们能更快送达。

这个人虽然懒,但是他却很有钱。要知道,有钱能使鬼推磨~。
而且不可多得是的他还有一个聪明的小脑瓜。
下面就来看看他是怎么灵活的运用他的财力及智力,来实现他的“惊天计划”。

金主“Dijkstra”买了几辆叫“广度优先搜索”的超级跑车,让自己的计划能够顺利进行。毕竟“工欲利其事必先利其器”。
然后,他还搞到了一张地图,标有距离。

最短路径问题之Dijkstra算法趣解_第1张图片

之后,他雇来了许多人,在一个月黑风高之夜,惊天密谋在悄然酝酿~

他将手下大致上分为两组,记录组行动组
记录组又在内部被细分成三组:
dis组记录原点到其他铺子的最短距离。
当然,在行动开始前,他们只记录着原点直接能到达的距离。其他的被写为无穷,在行动中这些数据会不断被更新。
最短路径问题之Dijkstra算法趣解_第2张图片
t组:用来记录已经求出最短路径的铺子编号。这组可以告诉我们行动何时停止。

O组:这组记录着每个铺子最短路径是来源于哪个方向。根据这个我们就可以逆推出,原点到它的最短路线。

而行动组也被分成六组。一组在家中,其他组被分配在每个铺子的标记点,铺子编号即是组名,每个铺子的“出度”是多少就分配几人,伺机而动。

一切安排妥当之后,他向手下讲述他的行动方案:
行动组从一组开始,通过无线电询问dis组中的最小值,即去某一目标铺子的最短路径。(已走过的路就不必再走)。但是dis的回答,每组都会听到。
比如说,
1组开始行动,先询问dis组:“目前未走过的最短路径是多少?”
dis组的负责人告诉他“是你去3号铺的10”,那么他就开上超跑奔袭10,去3号铺。到达之后,告诉t组的负责人:“去3号铺的最短路径已经知道,加以标记“。他还会告诉O组,”3号铺的源方向为1(即家中)“。这条路径成为了确定值。(当然,t,O组的值都会在行动过程中不断被更新)

因为每一段距离都是正值,而且起始条件为最短,所以不可能通过第三个点中转,使得去3号的距离更短。

1组的人去了3号铺之后,3组的人就知道这时候该他们行动了。
与1组的行动不同的是,他们首先要做的是,先将自己能直接到达的路径及其长度告知dis组,要注意的是,dis组记录的永远是从原点到某一点的距离,因此,dis组更新数据如下,

之后,3组再向dis组的负责人询问:“目前未走过的最短路径是多少?“
dis组的人告诉他:“是从家中到5号铺的30”,这时,1组的人就会开上另一辆超跑,去向5号铺。到了之后让t组及O组更新数据。然后5组行动前,dis如下

每组的行动都是如此,大致分为三步:
1、告知自己可选择的路,让dis组更新数据。
2、根据dis组所给的最短路径,对应路径的小组开始行动。
3、每组行动结束之后,告知t组及O组,更新数据。

等到那黑云慢慢蚕食了明月。行动进行~

下面是其他组行动时 的dis组的阶段更新数据:
5–>4

4–>6
最短路径问题之Dijkstra算法趣解_第3张图片
此时t组负责人告知全部成员行动结束。

			   t					  dis
起点  终点    最短路径  				  长度
v1    v2         无          		    ∞    
      v3       {v1,v3}    		       10
      v4       {v1,v5,v4}  		        5
      v5       {v1,v5}    			   30
      v6       {v1,v5,v4,v6} 		   60

如果有理解有偏差的地方,希望大家能批评指正。
最后希望大家都未来可期~。

你可能感兴趣的:(最短路径问题,算法)