关于如何理解图论的最短路径算法

74 阅读2分钟
                关于如何理解图论的最短路径算法

最短路径算法就是在定向遍历基于出发点的所有路径中从最短到最长的所有路径,寻找第一短的路径,第二短的路径,第三短的路径,以此类推。之后请求了一个状态数组,作为过滤器。现在是只以路径长短为导向的,他这个路径的终点具体是啥我并不知道。而状态数组在便历过程中负责筛选,如果这个路径的终点对应的最短路径并未找到,就留下它,并将其状态标为已知。   下面我来说它具体的如何找做到逐次定向找到第一,第二,第三……短的路径。 以这张图为例

image.png 寻找从f出发的到各个顶点的最短路径 先寻找第一短的路径,先抽象出这样一个模型哈,这个图里囊括了从f出发到它的第一级顶点的所有路径

cf0515a2358ce86db7e2e41478bf8c39.jpg 现在图中的所有F出发的路径路径,必然有a或b这两条路径作为初始一部分 ,那么,所有的其他路径都是大于这两条路径的。剩下的两条路径中最短的必然是全体路径中最短的。 由此,确定F->B为第一短路径。然后我们来确定第二段路径。首先,我们来明确一个定义就是第二短的路径是 所有大于第一短的路径的集合 中的 最短的那个路径。那么我们需要去遍历这个大于第一短的路径的集合吗?我们只需要遍历一小部分即可。 如图

56eb0c3d8ab228518dacaecce8da921c.jpg 包括原来的一级路径和由F->B的终点所扩展出来的下一级路径。因为他们同时处于我之前所谓的大于第一短的路径的大集合中,但是在这个大集合中的其他路径又均大于他们,那么第短路径一定在现在这个小集合当中。 f->b->c和f->a的值的大小取决于b->c的大小,所以统一比较,不可再缩小范围。 ------ 关于第三短路径的寻找,类似于从第一短路径找到第二短路径,本质上是在大于第二短的所有路径的集合中找到最短的那个路径。

之后以此类推,最终找齐所有最短路径为止