本总结是是个人为防止遗忘而作,不得转载和商用。
题目
该问题也叫“单元点最短路径问题”,即:给定一个起点到其他所有点的最短路径。
前提:
假定已经给出了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”
之后就同理了。