迪杰斯特拉算法(一)

  • 迪杰斯特拉算法

数据结构图这一部分中的迪杰斯特拉算法,在实际中找最短路径应用广泛,本篇博文主要描述它的实现思路。准备另一篇再将代码实现陈述一遍,主要目的是让其在我脑海中刻骨铭心一点。因为这个算法已经让我耗费了不少的时间和精力。

在这里插入图片描述
i代表下标,Y右侧代表已经访问过的路径,= 标记已经找到最短路径,pm代表上一个已经找到最端口路径的节点,每一列的数字表示从原点到当前节点之间的长度,无穷表示没有可达路径。(由于空间有限还有本人较懒,就写一下开始的路径,后面就不写了)。

i N \ Y A B C D G E F
2 B 2(A->B) = = = = =
3 C 4(A->B) 3(A->B->C) = = = = =
4 D ∞(A->B) 5 5 = = = =
5 E ∞(A->B) 7(A->B->D->E) 6(A->B->C->G->E) = =
6 F ∞(A->B) 6(A->B->C->F) 6 6 6 =
7 G ∞(A->B) 5(A->B->C->G) 5 = = =
pm A B C D G E F

如上图所示,总共有七个节点的无向图,我们现在要找从A到其他各个顶点之间的最短路径,首先我们肯是从与A相邻的结点开始向外延伸探索,在这里我们管A称为源点。

现在我们根据上面的图来填充上面的表格,尽管我已经将结果附在上面。

首先就从A出发,与A相连的节点有B和C权值分别是2和4,因为A->B之间路径长度最小,所以,原点到B的最短路径就是2。

下来我们在以后就不用管从A间接地经过其他节点再到B的情况了。因为在表中我们已经可以发现不可能有从A到其他节点再到B的路径比A直接到B的路径还小了。

所以我们紧接着,就来以B开始再看从A->B再到其他未找到最短路径的节点之间的距离,即就是表中的上下都是B的那一列。

找到后为C,即我们找到了从A->B->C这条从原点A到C之间的最短路径。继续从C开始探索看有没有从A->B->C到其他节点之间的最短路径

在C那一列很明显,从A->B->C到D没有可达的路径,而回到上一级从A->B->D之间的路径是C那一列中最短的路径,则我们下一次看从A->B->D到其他节点之间的路径长度情况。

总之就重复以上步骤,要想确定整条路径为最短,即我们必须使从原点(A)到组成这条路径中任何一个的节点长度为最短。

好了,迪杰斯特拉算法找最短路径的整个过程,就总结到这块。算法实现将在(二)中呈现。

要是讲的不全的话或者有什么疑问,欢迎交流!

猜你喜欢

转载自blog.csdn.net/qq_41681241/article/details/85253383