最短路径(SPF - Shortest Path Firsh) - Dijkstra算法

来源:互联网 发布:mysql add unique 编辑:程序博客网 时间:2024/05/16 01:21

本总结是是个人为防止遗忘而作,不得转载和商用。

题目

         该问题也叫“单元点最短路径问题”,即:给定一个起点到其他所有点的最短路径。

         前提:

                   假定已经给出了Wij,即第i个点到第j个点的边的距离的衡量(权值),Wij要么是∞(i到j不通),要么是大于0的某一个值。

思路解析

         对于从v0至w,且经过最后一个中间结点为u的最短路径,有:

                   DIST(w)= DIST(u) + c(u,w)

         随着u的加入, DIST(w)调整为

                   DIST(w)= min(DIST(w),DIST(u) + c(u,w))

 

         既然让我们求某一个点S到某个点E的最短路径,那我们扩展一下,求S到所有点other的最短路径,于是总有一个时刻,other中包含了E,这样不就求出了从S到E的最短路径。

例子

         如上图所示,我们相求从v1到v7的最短路径,于是进行下图所示的迭代

         第一行:

改行是v1到v2,v3…,v7的最短路径

最初集合S中只有起点v1,而当前已找到的路径也是v1

于是遍历v1可以到达的不在几何S中的点,找到最近的,发现是v2,因此把v2包含在集合S中(于是第二行的S中多了个2),已找到的路径更新成“v1->v2”

         第二行:

经上一步v2包含在了集合S中

之后同上,遍历v2可以到达的不在集合S中的点,有v3和v6.

对于v6,有如下情况:

         v1 -> v2 -> v6:距离90

         v1 -> v6:距离∞

所以将v1到v6的距离更新成90,v1到v3同理更新成45。

现在v1到达各点的最短距离已经更新,即第二行。

接下来,同上,遍历v1可以到达的不在几何S中的点,找到最近的,发现是v4,于是把v4包含在集合S中(于是第三行的S中多了4),已找到的路径更新成“v1->v2->v4”

         之后就同理了。

 

 

        

 

0 0
原创粉丝点击