Dijkstra算法求由顶点a到顶点h的最短路径-算法分析与实践作业2-1

1.问题

对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径 

2.解析

用V1表示已经找到最短路径的顶点,V2表示与V1中某个顶点相邻接且不在V1中的顶点;E1表示加入到最短路径中的边,E2为与V1中的顶点相邻接且距离最短的路径。

步骤    V1          V2      E1          E2 
1.    {a}    {b}      {}          {ab}
2.    {a,b}    {d}     {ab}        {bd} 
3.    {a,b,d}       {c,f}   {ab,bd}      {dc,df}
4.    {a,b,d,c}      {f}      {ab,bd}      {df} 
5.    {a,b,c,d,f}     {e}    {ab,bd,dc,df}  {fe} 
6.    {a,b,c,d,e,f}  {g}    {ab,bd,dc,df,fe}     {eg}
7.    {a,b,c,d,e,f,g}  {h}     {ab,bd,dc,df,fe,eg}   {gh}
8.    {a,b,c,d,e,f,g,h}  {}      {ab,bd,de,df,fe,eg,gh}   {}

求所有顶点对之间的最短路径可以使用Dijkstra算法,使其起始节点从a循环到h,每次求起始节点到其他节点的最短路径,最终可以求得所有顶点对之间的最短路径。

使用二维数组作表存储顶点之间的关系。 将a比作V1,b比作V2依次类推得:
a:V0, b:V1,c:V2, d:V3, e:V4, f:V5, g:V6, h:V7
得到图:

3. 设计

伪代码

算法:Dijkstra(G,s)
//单起点最短路径的Dijkstra算法
//输入;具非负权重加权连通图G = <V , E>以及它的顶点s
//以及路径上的倒数第二个顶点pv
Initialize(Q)
for V中每一个顶点v
	dv←;pv←null
	Insert(Q, v, dv) //初始化优先队列中顶点的优先级
ds←0; Decrease(Q,s,ds) //将s的优先级更新为ds
VT←Ø
for i←0 to |V|-1 do
	u*DeleteMin(Q) //删除优先级最小的元素
	VT←VT∪{u*}
	for V-VT中每一个和u*相邻的顶点u do
		if du* + w(u*, u) <du
			du←du*+w(u*,u); pu←u*
			Decrease(Q , u, du)

实验截图:

4. 分析

[算法复杂度推导]
不会推,ԾㅂԾ,,结论:O(n^2)

5. 源码

[github源码地址]
https://github.com/Lin02993/Algorithm-Analysis-and-Practice-on-the-job

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,给定一个加权有向图,假设我们要顶点V0到其他各顶点之间的最短路径。我们可以使用Dijkstra算法来解决这个问题。下面是Dijkstra算法的步骤: 1. 创建两个集合S和Q。S表示已经找到最短路径顶点集合,Q表示还未找到最短路径顶点集合。 2. 初始化距离数组dist,表示从V0到其他各顶点的距离。对于V0, dist[V0]=0;对于其他各顶点,dist[i]=无穷大。 3. 将V0加入集合S,将其他顶点加入集合Q。 4. 对于V0的邻居节点i,更新dist[i],即dist[i]=weight(V0,i),其weight(V0,i)表示从V0到i的边的权重。 5. 从Q选择dist值最小的顶点u,将u加入集合S,从Q删除u。 6. 对于u的每个邻居节点v,如果v不在集合S,更新dist[v],即dist[v]=min{dist[v],dist[u]+weight(u,v)},其weight(u,v)表示从u到v的边的权重。 7. 重复步骤5-6直到集合Q为空。 8. 最短路径长度为dist数组的值,最短路径可以通过记录每个顶点的前驱节点来生成。 下面是一个示例,假设有以下加权有向图: ![Dijkstra图示例](https://cdn.luogu.com.cn/upload/image_hosting/brp8g8uj.png) 我们要顶点V0到其他各顶点之间的最短路径。 1. 创建集合S和Q。初始状态:S={V0},Q={V1,V2,V3,V4,V5}。 2. 初始化dist数组。dist[V0]=0,其他各顶点dist[i]=无穷大。 3. 对于V0的邻居节点,更新dist数组。dist[V1]=10,dist[V2]=5,dist[V3]=无穷大,dist[V4]=无穷大,dist[V5]=无穷大。 4. 从Q选择dist值最小的顶点V2,将其加入集合S。更新dist数组。dist[V3]=11,dist[V4]=15,dist[V5]=9。 5. 从Q选择dist值最小的顶点V5,将其加入集合S。更新dist数组。dist[V4]=14。 6. 从Q选择dist值最小的顶点V1,将其加入集合S。更新dist数组。dist[V3]=9。 7. 从Q选择dist值最小的顶点V3,将其加入集合S。更新dist数组。没有需要更新的dist值了。 8. 最短路径长度为dist数组的值,最短路径可以通过记录每个顶点的前驱节点来生成。例如,V1的前驱节点为V2,V2的前驱节点为V0,V3的前驱节点为V1,V4的前驱节点为V5,V5的前驱节点为V0。 因此,从顶点V0到其他各顶点之间的最短路径以及最短路径长度分别为: | 顶点 | 最短路径 | 最短路径长度 | | --- | --- | --- | | V0 | - | 0 | | V1 | V0 -> V2 -> V1 | 15 | | V2 | V0 -> V2 | 5 | | V3 | V0 -> V2 -> V1 -> V3 | 14 | | V4 | V0 -> V5 -> V4 | 23 | | V5 | V0 -> V5 | 9 |

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值