Dijkstra算法的一个例子

本文介绍了Dijkstra算法的基本原理,包括其输入定义、关键操作过程以及如何寻找加权有向图中从一个顶点到其它所有顶点的最短路径。

    Dijkstra算法的输入包含了一个有权重的有向图G ,以及G中的一个来源顶点S 。 我们以V表示G中所有顶点的集合 。 每一个图中的边,都是两 个顶点所形成的有序元素对。(u,v)表示从顶点u到v有路径相连。 我们以E所有边的集合,而边的权重则由权重函数w: E → [0, ∞]定 义。 因此,w(u,v)就是从顶点u到顶点v的非负花费值(cost)。 边的花费可以想像成两个顶点之间的距离。任两点间路径的花费值,就是该路径上 所有边的花费值总和。  已知有V中有顶点s及t,Dijkstra算法可以找到s到t的最低花费路径(i.e. 最短路径)。 这个算法也可以在一个图 中,找到从一个顶点s到任何其他顶点的最短路径。

    Dijstra算法的基础操作是边的拓展 :如果存在一条从u到v的边,那么从s到u的最短路径可以通过将边(u,v)添加到尾部来拓展一条从s到v 的路径。这条路径的长度是d[u]+w(u,v) 。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直 执行到所有的d[v]都代表从s到v最短路径的花费。这个算法经过组织因而当d[u]达到它最终的值的时候没条边(u,v)都只被拓展一次。

 

    Dijkstra算法图示:

 

 

 

 

 

 

 

 

 

 

 

 

转自:Dijkstra算法学习笔记

 

 

 

 

好的,我们来看一个例子: 假设有一个城市地图,其中有6个城市和它们之间的道路,如下图所示: ![graph_example](https://cdn.luogu.com.cn/upload/image_hosting/ty1u9gs7.png) 现在要从城市1出发,到达城市6。我们可以使用Dijkstra算法来找到最短路径。 首先,我们初始化一个距离数组dist,它表示从起点出发到每个城市的距离。由于起点是1号城市,所以我们将dist[1]初始化为0,其他城市的距离先设为无穷大(表示暂时不可达)。 然后,我们从起点1开始遍历所有可到达的城市,并将它们加入一个优先队列中(按照距离从小到大排序)。然后每次从队列中取出距离最小的城市,更新与它相邻的城市的距离值。这个过程持续进行,直到我们找到了终点6或者队列为空。 具体的步骤如下: 1. 初始化dist数组:dist[1] = 0,dist[2..6] = ∞ 2. 将起点1加入优先队列 3. 取出队列中距离最小的城市1,遍历它的所有邻居城市 4. 如果从1号城市到某个邻居城市的距离更短,就更新邻居城市的dist值,并将该城市加入优先队列中 5. 重复步骤3~4,直到找到终点6或者队列为空 具体执行过程如下图所示: ![dijkstra_example](https://cdn.luogu.com.cn/upload/image_hosting/8l8n2vrn.png) 最终,我们得到了从起点1到终点6的最短路径长度为11,该路径为1 -> 3 -> 6。 希望这个例子能够帮助你更好地理解Dijkstra算法
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值