老规矩,我们首先给出该算法的具体流程:
- X={s} %%记录有没有被探索过
- A[s]=0 %% 该节点的最短路径
-B[s]=[s]%% 保存该节点的最短路径
- while x != v
- among all edges (v,w) E,
%% 边的集合
- pick one that minimize A[v] + 假设是
- add to X
- set A[] =
- set
这个算法最重要的地方就是我标红的地方,注意是all edge, 虽然我们最后只选择一条边加入X。
我们根据示意图从头到尾开始说一下这个算法具体执行的流程。
第一步,X=[s], 将起始点s加入X。此时A[s]=0; B[s]=[s]。
第二步, 和s所有相连的边满足s在X中,其他点不在,且是从s指向该点的。我们看,两条路径,分别是 s到v, s到w。 我们选择哪一条呢? 由于都是从s点出发的,因此我们选择更短的那一条就行了。 于是选择v点加入X中。 A[v]= 1; B[v]=[s,v]
第三步, 此时X=[s, v], 满足从s或者v出发,不在X中的点的路径有3条 s到w v到w v到t,我们分别比较一下这三条路径的长度。 s到w A[s]+ =4,
,
3。显然此时v到w这条路最短。选择w加入X,X=[s v w]。这里注意一下,是不是发现我们选择的时候就没有说一定要从s 或者v出发了呀。因此A[w] = 3, B[w]=[s v w]
第四步:我们可以看到从w到t距离为6 从v到t 距离为7,所以我们选择从w到t。最后A[t]=6, B[t]=[s v w t]。
这里面最关键的就是第3步的理解。
主要要注意一点就是所有X中的点,从s点到该点的最短距离我们都已经计算得到了,存储在A[v]中。这一点非常有助于我们理解这个算法。下一篇文章,我们就讨论下这个算法为什么是对的。