迪杰斯特拉快速解题,非代码

仿照下面的过程和步骤可以快速解题,应付期末考试或者考研比较快一点。

利用迪杰斯特拉算法求出下图中从顶点a到其他各顶点的最短路径。
在这里插入图片描述

终点↓\D→i=1i=2i=3i=4i=5i=6
b15(a,b)15(a,b)15(a,b)15(a,b)15(a,b)15(a,b)
c2(a,c)
d12(a,d)12(a,d)11(a,c,f,d)11(a,c,f,d)
e10(a,c,e)10(a,c,e)
f6(a,c,f)
g16(a,c,f,g)16(a,c,f,g)14(a,c,f,d,g)
S终点集{a,c}{a,c,f}{a,c,f,e}{a,c,f,e,d}{a,c,f,e,d,g}{a,c,f,d,g,b}

顺序为从上到下看,注意不是从左到右,从左到右也可以看,但是不是解题的时候看

  • 第一趟,找出a到各个顶点的距离,例如a到c的距离为2,如图中第一列加粗部分,到e到f到g没有路径,所以填无穷大,同理你可以先把第一列的数据全部填好。然后找到当中的最短路径,写到终点集里,第一列中最短的为加粗部分,即2(a,c),所以我们把ac路径写到终点集里,所以终点集第一趟为{a,c}。
  • 第二趟,同1的操作,但是因为在1中已经找到了ac的最短路径,即2,之后的任何路径都不可能比这个更短,所以第二行就不用写了,下面几趟同理。但是这里有个小变化,我们要根据第一趟的结果集来比较是否出现了更短的路径,比如e和f,在加入了ac路径之后,e和f就有路径了,于是就改成10和6。不改b和d的原因可以看图,加入了ac路径后,并没有产生新的路径或最短路径,于是维持原样,找到最短的6(a,c,f),然后将f写入s终点集变成acf。
  • 第三趟,同2的操作,加入了acf后,d和g出现了更短的路径,因为acfd=11<ad=12,所以这里更新了11,改成了acfd。找到最短的,10(a,c,e),将e写入结果集,变成acfe。
  • 第四趟,同3的操作,加入acfe后,最短路径d需要更新,其他均没有之前的短,所以修改d路径即可。将新加的d写入结果集变成acfed。
  • 第五趟,同4的操作,并入acfed后发现g的最短路径变成了14,修改g,比较大小后将g加入结果集,于是变成acfedg
  • 第六趟,将最后的b加入结果集,得到acfedge即为结果。

如何确认新加节点后,是否需要改变?

我的做法是根据最新加的节点周围找最短边。 相等不变,不等取最小路径更新。

  • 第二趟,根据1的结果集,新加的是c,检查c->b,c->d,b->e,b->f,b->g,发现c->e、f有边了,那么改e和f的路径,c->d、b、g压根没边,不管。无穷大的就不说了,只要有新路径,肯定比无穷大小,于是写成新的。
  • 第三趟,根据2的结果集,新加的是f,检查f到剩余各点的距离,f出度只有2,也就是d,g,只看这俩其他不管。f->d=5,5+上趟最短的6=11<12,好这个短,换这个路径,改成11,路径更新换成acfd,f到g是10,10+6=16=g的acfg路径,不改。
  • 第四趟,根据3的结果集找e到各点的距离,一比,没有一个比之前的更小。因为e只有到g有边=9,我们把9+上一趟的10,结果是19还不如现在的16呢,所以不变。
  • 第五趟,根据4的结果,比较d到各点的距离,d只有到g有边=3,比较3+上一趟的11=14,哎!小于上次的16,这个才14,好换这个路径,更新acfdg。
  • 最后一个放上去,完事。

因为每一趟都会减少点,所以比较的速度越来越快。
看着好像写的很多,但是其实都是根据表格从左到右,每趟结束可以把最短的路径写表格下面,方便下一趟加减比较,题目不难计算一般都是二位数或者一位数。

如有错误请留言。
2021年11月21日11:00:21

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值