数据结构——最短路径问题之Dijkstra和Floyd

Dijkstra算法

适用于计算一个顶点到其他所有

直接结合题目分析
【例】
在这里插入图片描述

分析上图从源点a到其它各顶点的最短路径:
第一趟:从源点a出发,到b,代价是2;a到c代价是5,取小者,加入集合S={a,b}
第二趟:从b出发,可以到c和d,a->b->c代价是3(比a直接到c的代价5要小,保留),a->b->d代价是5,取小者加入集合S={a,b,c}
第三趟:从c出发,可以到d,e,f;a->b->c->d代价是6(比a->b->d代价5要大,需要更新)更新为a->b->d代价5;a->b->c->e代价是7;a->b->c->f代价是4;取小者4加入集合S={a,b,c,f}
第四趟:从f出发,还剩下顶点d和e,即就是a->b->c->f->d代价是∞(比a->b->d代价5要大,需要更新)更新为a->b->d代价5;a->b->c->f->e代价是∞(比a->b->c->e代价7要大,需要更新)更新为a->b->c->e代价7;取小者5加入集合S={a,b,c,f,d}
第五趟:只剩下e,直接加入集合S={a,b,c,f,d,e}

在这里插入图片描述
【例2】
在这里插入图片描述
在这里插入图片描述
分析上图从顶点1到其它各顶点的最短路径:
第一趟:从顶点1出发到2,代价是5;1到5代价是4,取小者,加入集合S={1,5}
第二趟:从5出发,可以到2,4,6,1->5->2代价是10(比1直接到2的代价5要大,舍弃)取1到2代价5;1->5->4代价是11;1->5->6代价是9;取小者加入集合S={1,5,2}
第三趟:从2出发,可以到3,4,1->2->3代价是7;1->2->4代价是14(比1->5->4代价是11要大,舍弃)取1->5->4代价11;取小者加入集合S={1,5,2,3}
第四趟:同理,取小者加入集合S={1,5,2,3,6}
第五趟:只剩下4,直接加入集合S={1,5,2,3,6,4}

【例】(2022年8题)如下图,从顶点1到2,3,4,5的最短路径保存在dist中,求出第二条最短路径后,dist中的内容更新为____.(选C)
A. 26,3,14,6
B. 25,3,14,6
C.21,3,14,6
D.15,3,14,6
在这里插入图片描述
首先初始化三个数组信息:
1.标记各顶点是否已找到最短路径:final[]
2.最短路径长度:dist[]
3.每一个顶点在最短路径上的直接前驱:path[]

顶点v2v3v4v5
finalfalsefalsefalsefalse
dist2636
path111

寻找第一条最短路径:循环遍历所有顶点,找到还没确定最短路径(即final值为false),且dist最小的顶点v3,令其final值为true。并且检查所有邻接自v3的顶点,若其final值为false,并且走v3路径代价更小的话,则更新dist和path信息。(这里更新了v2的dist和path信息,因为从v1->v3->v2的代价25比v1->v2代价26要小)

顶点v2v3v4v5
finalfalsetruefalsefalse
dist 25 {\color{Orange} 25} 2536
path 3 {\color{Orange} 3} 311

寻找第二条最短路径:同上(这里进一步更新了v2的dist和path信息,因为从v1->v5->v2的代价21要更小些;更新了v4,从v1->v5->v4有了路径,代价为14)

顶点v2v3v4v5
finalfalsetruefalsetrue
dist 21 {\color{Orange} 21} 213 14 {\color{Orange} 14} 146
path 5 {\color{Orange} 5} 51 5 {\color{Orange} 5} 51

Floyd

适用于一对一顶点,求每对顶点之间的最短路径
使用动态规划思想,将问题的求解分为多个阶段
【例】
在这里插入图片描述
初始:不允许经过其它顶点中转的最短路径
各顶点之间的最短路径A(-1):在这里插入图片描述

两个顶点之间的中转点path(-1):(初始时都没有中转点)
在这里插入图片描述
下一步,若允许在V0中转的最短路径:
A(0):在这里插入图片描述
path(0):
在这里插入图片描述
下一步,若允许在V0,V1中转的最短路径:
A(1):
在这里插入图片描述

path(1):
在这里插入图片描述
下一步,若允许在V0,V1,V2中转的最短路径:
A(2):
在这里插入图片描述
path(2):
在这里插入图片描述

根据A(2)可知,V1到V2的最短路径长度为4,V0到V2的最短路径长度为10,同时结合path(2)可知,V1到V2的完整路径信息为V1->V2;V0到V2的完整路径信息为V0->V1->V2

【例】在这里插入图片描述
初始:不允许经过其它顶点中转的最短路径
各顶点之间的最短路径A(-1):在这里插入图片描述
两个顶点之间的中转点path(-1):(初始时都没有中转点)在这里插入图片描述
#1:若允许在V0,V1中转的最短路径
在这里插入图片描述
原本V2没有直接到V3的路径,经过V1中转,V2->V1->V3代价为2;同样V2->V1->V4代价更新为6;对应的path更新为1,代表从V1结点进行了中转;

#2:若允许在V0,V1,V2中转的最短路径
在这里插入图片描述
同理,原本V0没有直接到V1的路径,经过V2中转,V0->V2->V1代价为2;这里需要说明的是,从V0到V3,可以经过了V2中转,由于从上一步已经得出了从V0到V2经过了V1中转,于是从V0到V3的完整路径其实是V0>V2->V1>V3,代价是3;从V0到V4原本代价是10,经过V2中转,V0>V2->V1>V4,代价更新为7;

#3:若允许在V0,V1,V2,V3中转的最短路径
在这里插入图片描述
#4:若允许在V0,V1,V2,V3,V4中转的最短路径
在这里插入图片描述
经过这一步,发现任何地方都不需要修改

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值