仿照下面的过程和步骤可以快速解题,应付期末考试或者考研比较快一点。
利用迪杰斯特拉算法求出下图中从顶点a到其他各顶点的最短路径。
终点↓\D→ | i=1 | i=2 | i=3 | i=4 | i=5 | i=6 |
---|---|---|---|---|---|---|
b | 15(a,b) | 15(a,b) | 15(a,b) | 15(a,b) | 15(a,b) | 15(a,b) |
c | 2(a,c) | |||||
d | 12(a,d) | 12(a,d) | 11(a,c,f,d) | 11(a,c,f,d) | ||
e | ∞ | 10(a,c,e) | 10(a,c,e) | |||
f | ∞ | 6(a,c,f) | ||||
g | ∞ | ∞ | 16(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