最短路径算法-迪杰特斯拉算法(Dijkstra)

 老规矩,我们首先给出该算法的具体流程:

- X={s} %%记录有没有被探索过

- A[s]=0 %% 该节点的最短路径

-B[s]=[s]%% 保存该节点的最短路径

- while x != v

        - among all edges (v,w) \in E,v \in X, w \notin X  %% 边的集合

        - pick one that minimize A[v] + l_{l,w}  假设是(v^{\star}, w^{\star})

        - add w^{\star} to X

        - set A[w^{\star}] = A[v^{\star}] +l_{v^{\star}, w^{\star}}

        - set B[w^{\star}]=B[v^{\star}] \cup (v^{\star}, w^{\star})

 这个算法最重要的地方就是我标红的地方,注意是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]+ l_{s,w}=4, A[v]+l_{v, t}=7A[v]+l_{v,w}=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]中。这一点非常有助于我们理解这个算法。下一篇文章,我们就讨论下这个算法为什么是对的。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值