数据结构:图的应用最短路径Dijkstra(迪杰斯特拉)算法

Dijkstra算法是一种解决单源最短路径问题的贪心算法。它的主要思想是从起点出发,逐步确定从起点到各顶点的最短路径,并标记已经确定最短路径的顶点。通过不断更新顶点的最短路径和路径长度,最终得到起点到其他所有顶点的最短路径。

以下是Dijkstra算法的流程和步骤:

【1】 初始化:创建一个距离数组dist[]和一个标记数组visited[],并将起点到起点的距离设为0,其他顶点到起点的距离设为无穷大(表示尚未确定最短路径),将visited[]数组初始化为false。

【2】选择当前距离起点最近的顶点作为当前顶点,标记为已访问。

【3】 遍历当前顶点的邻接顶点,计算从起点经过当前顶点到邻接顶点的距离。若该距离小于邻接顶点的当前最短路径,则更新邻接顶点的最短路径和路径长度。

【4】 从未标记的顶点中选择距离起点最近的顶点作为下一个当前顶点,重复步骤3,直到所有顶点都被访问。

【5】 最终得到起点到各顶点的最短路径和路径长度。

示例:使用下图来演示如何求Dijkstra最短距离

下面我们通过一个通俗易懂的图示来演示Dijkstra算法的过程。我们创建一个距离数组dist[]和一个标记数组visited[],其中dist[]红色代表选中该节点;visited[]绿色代表访问过。

   初始化:创建一个距离数组dist[]和一个标记数组visited[],并将起点到起点的距离设为0,其他顶点到起点的距离设为无穷大(表示尚未确定最短路径),将visited[]数组初始化为false(标记绿色为true)。

步骤-1:

【1】对于节点1,其距离为0,将0填入dist[]对应节点的位置;对应的节点已经被访问过,将visited[]对应节点的位置标记为绿色;

【2】当前顶点的邻接顶点2、3,距离分别为2、15。更新邻接顶点的最短路径和路径长度,在这里将原来的无穷大更新为现有的值即可;

【3】从未标记的顶点中选择距离起点最近的顶点作为下一个当前顶点,在数组dist[]中,被访问的节点除外,节点2的值2最小,选择下一个节点2。

步骤-2:

【1】对于节点2,其距离为2,将2填入dist[]对应节点的位置;对应的节点已经被访问过,将visited[]对应节点的位置标记为绿色;

【2当前顶点的邻接顶点3、4,其距离分别为10(2+8)、7(2+5)。则更新邻接顶点的最短路径和路径长度,在这里节点3原来为15更新为10,节点4由无穷大更新为7,下同;

【3】 从未标记的顶点中选择距离起点最近的顶点作为下一个当前顶点,在数组dist[]中,被访问的节点除外,节点4的值7最小,选择节点4。

步骤-3:

【1】对于节点4,其距离为7,将7填入dist[]对应节点的位置;对应的节点已经被访问过,将visited[]对应节点的位置标记为绿色;

【2当前顶点的邻接顶点5、6,其距离分别为23、35。

【3】 从未标记的顶点中选择距离起点最近的顶点作为下一个当前顶点,在数组dist[]中,被访问的节点除外,节点3的值10最小,选择节点3。

步骤-4:

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数字化与智能化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值