单源顶点最短路径java_单源最短路径-Dijkstra 算法

d1b7af0004ad35d32a8e063fe27b2a1e.png

Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

问题:求a点到各个点的最短距离,如下图:

916c5177b1125de6e5125324c2f99d7b.png

要求最短距离我们得知道以下两个关于最短距离的定理:

1.

b78010e15ccd8d031d5edd40f868c410.png

可以简单描述为:最短路径的子路径也是最短路径。

2.如果考虑到边的权值为正数,则由定理 7.2 可以得到以下结论:若π = (s , u1 , u2 , … , uk)是从s到uk的最短路径,则从s到各顶点ui(i=1, 2, …k)的最短路径是严格递增的。

下面我们介绍一下Dijkstra 算法。

Dijkstra 算法将带权图 G = (V, E)的顶点分为两个集合:S 、V - S,其中

顶点集 S 是已求出的最短路径的终点集合(初始时 S = {s})。

顶点集 V-S 是尚未求出最短路径的终点的集合。

算法将按最短路径长度递增的顺序逐个将 V-S 中的顶点加入到 S 中,直到所有顶点都被加 入到 S 中为止。 算法为每个顶点 v 定义了一个变量 distance,该变量记录了从 s 出发,经由 S 中的顶点 到达 v 的当前最短距离。初始时,每个顶点的当前最短距离 distance 为图中从 s 到 v 的边的 权值,如果从 s 到 v 没有边则 distance(v) = ∞,并且 distance(s) = 0

Dijkstra 算法的基本执行过程如下:

① 初始化: S = {s};

distance(s) = 0;

distance(ui) = w(s , ui)或∞,(ui∈V-S);

② 选择distance (uk) = min{ distance (ui)| ui ∈V-S},uk为下一条最短路径的终点;

③ S = S ∪{ uk }

④ 以uk为“中转”,修正V-S中各个顶点distance:

distance (ui) = min{ distance (ui) , distance (uk)+w(uk , ui)} ui∈V-S

⑤ 重复②—④步|V|-1 次。

具体如下图所示。

e1757bba7839337f711f26e7ec76b4fc.pngDijkstra 算法执行过程

描述如下:

1.(a)图中先初始化 a 到自身的距离为0,与a直接相连的b和c的距离为10和3其他不直接相连的记为∞。此时S={a},初始化后结果如图(b).

2.(b)图中因为distance(b)>distance(c)所以选择C作为下一条最短路径的终点。此时S={a,c},然后修正a到V-S中各个顶点distance,因为与C直接相连的边有b,d,e,然后与S中其他定点(此时只有a定点)直接到V-S中个定点的distance比较后得到结果如图(c).

3.重复步骤2的动作直到所有定点都包含在S中,最终结果如图(f).

理解了Dijkstra 算法吗?下一篇我们讲具体java代码实现!

分享所得,方便别人,成就自己,感谢大家!

91eb9d1132716bcbebddc438f4222845.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值