最短路径算法_最短路径之狄克斯特拉(Dijkstra)算法

相比较贝尔曼-福特算法需要每次对所有边进行松弛操作,时间复杂度为O(顶点数*边数),并且可以处理负权边,但是我们在实际生活中,计算路径的时候,极少遇到负权边的情况,所以只考虑正权边的情况下,可以采用更优化的Dijkstra算法。

Dijkstra算法设置了两个集合,设所有顶点集合为V,则:

S=所有与起点s已经确定最短路径、最低权重值的顶点。

W=V-S。

算法每次都将W中权重值最小的顶点u移入S中,并对u的所有边进行松弛操作。

看图说话:

63a1ad9b5c70e4fe393dd8c727983c95.png

初始化:

S=A0

W=B∞,C∞,D∞,E∞,F∞,G∞

1、需要对A的所有边进行松弛操作,结果

S=A0

W=B6,C4,D∞,E∞,F∞,G∞

2、取出W中最小的顶点C放入S,并对C所有边进行松弛操作,结果

S=A0,C4

W=B6,D9,E∞,F11,G∞

3、取出W中最小顶点B放入S,并对B所有边进行松弛操作,结果

S=A0,B6,C4

W=D9,E11,F11,G∞

4、取出W中最小的顶点D放入S,并对D所有边进行松弛操作,结果

S=A0,B6,C4,D9

W=E11,F10,G∞

5、取出W中最小的顶点F放入S,并对F所有边进行松弛操作,结果

S=A0,B6,C4,D9,F10

W=E11,G∞

6、取出W中最小的顶点E放入S,并对E所有边进行松弛操作,结果

S=A0,B6,C4,D9,E11,F10

W=G∞

7、取出W中最小的顶点G放入S,并对G所有边进行松弛操作,结果

S=A0,B6,C4,D9,E11,F10,G∞

至此,我们可以得出一个最短路径树:

A——B,6

A——C,4

A——C——D,9

A——B——E,11

A——C——D——F,10

A无法到达G

在这里有两个地方可以优化:

1、因为要取出权重最小的顶点,所以每次都要对W进行排序,采用遍历数组进行比较的算法,不如采用优先队列(PriorityQueue),因为优先队列采用了堆结构,排序时间复杂度是O (nlgn)。

2、如果我们只是想计算起点到某点的最短距离,那么在遍历的时候,检查一下取出的最小顶点是否是终点,如果是,跳出循环即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 狄克斯特拉算法是一种用于求解带权有向图最短路径算法。其基本思想是从起开始,逐步扩展到其他节,每次选择当前距离起最近的节,并更新其周围节的距离。通过不断迭代,最终得到起到所有节最短路径。 ### 回答2: 狄克斯特拉算法Dijkstra's Algorithm)是一种用于求解带有权重的有向图的最短路径算法。该算法的基本思想是通过不断更新起到其他顶最短距离,从而找到起到终最短路径。 具体步骤如下: 1. 创建一个集合S,用于存放已经找到最短路径的顶,以及一个数组dist,用于存放起到各个顶最短距离。初始时集合S为空,起到其他顶的距离为无穷大。 2. 将起加入到集合S中,并将起到自身的距离设为0。 3. 对于起的邻居顶,更新其距离。即对于起的每个邻居顶v,如果起经过当前顶u到达v的距离(dist[u]+weight[u][v])小于dist[v],则更新dist[v]为(dist[u]+weight[u][v])。 4. 从未加入集合S的顶中选择距离起最近的顶u,并将其加入到集合S中。 5. 重复步骤3-4,直到所有顶都加入集合S中,或者没有可更新的距离的顶。 6. 根据dist数组,可以找到起到任意顶最短距离。 需要注意的是,狄克斯特拉算法只适用于没有负权边的图,如果图中存在负权边,可以考虑使用其他算法如贝尔曼-福特算法(Bellman-Ford Algorithm)或弗洛伊德算法(Floyd-Warshall Algorithm)来求解最短路径。 总结起来,狄克斯特拉算法是一种通过不断更新起到各个顶最短距离来求解带权有向图的最短路径算法。它的时间复杂度为O(V^2),其中V为顶个数。 ### 回答3: 狄克斯特拉算法Dijkstra's algorithm)是一种用于解决带权有向图最短路径问题算法。下面就以一个简单的例子来说明狄克斯特拉算法的具体步骤。 假设有一个带权有向图,其中包含了一些节和边。我们要找到从起到终最短路径,其中每条边都有一个权重值表示距离,路径上的权重之和就是路径的总距离。 狄克斯特拉算法的步骤如下: 1. 初始化。将起的距离设置为0,其他节的距离设置为无穷大。同时将起标记为当前节。 2. 更新距离。从起出发,遍历所有与当前节相邻的节。如果通过当前节到达这些相邻节的距离比之前记录的距离更短,就更新这些节的距离。重复这个步骤,直到遍历完所有节。 3. 选择下一个节。从尚未处理的节中选择距离最小的节,并标记为当前节。 4. 重复步骤2和3,直到找到终或者遍历完所有节。 5. 最短路径还原。从终开始,通过记录的距离和上一步选择的节,依次反向找到起,即可得到最短路径狄克斯特拉算法的时间复杂度是O(V^2),其中V是节的数量。它适用于有向无环图和非负权重的情况。 总结以上就是用狄克斯特拉算法求解带权有向图最短路径的过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值