700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 单源顶点最短路径java_单源最短路径-Dijkstra 算法

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

时间:2023-07-11 08:23:17

相关推荐

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

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

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

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

1.

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

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 次。

具体如下图所示。

Dijkstra 算法执行过程

描述如下:

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代码实现!

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。