全部每周作业和视频思考题答案和解析 见 浙江大学 数据结构 思考题+每周练习答案汇总
虽然浙大的数据结构视频在前面讲的都很简单,但是讲到Dijkstra算法时,在课程中看到这样的解释我的内心是很懵逼的:
所以我还是画个图来看看怎么操作的吧,就用课程里的例子:
假设我们要找到v1到v6的最短路径,
建立一个dis数组,为了方面描述,坐标设为从1到7。鉴于没有负数,我们设还没遍历到的点为-1。
从1出发,1到1不需要任何路程,设为0。然后1可以到2或者到4,这里要注意的是我们选里面最小的作为确定路径。
第一轮:因为大家可以假设,你从1出发,到4需要路程为1,到2需要路程为2,也就是说,如果你再从2蹦到4,值一定比直接到4大。把1和4标记出来。
第二轮:从v4可以到v3,v5,v6,v7,先都写下来,从v1到v2是里面最小的,我们把2进行收录。:
第三轮:从v2出发,可以到v4和v5,v4已经收录了,从v1经过v2到v5的距离为12,大于之前的3,所以不记录进去。我们收录里面最小的v3。
第四轮:从v3出发,只能到v6,总路径为8,小于之前经过v4到v6的9,所以我们把8记录进去,收录里面最小的v5:
第五轮:从v5出发,只能到v7,总路径为9,大于之前的5,所以不记录进去,收录v7.
第六轮:从v7出发,能到v6,距离为6,小于8,所以记录6,并把v6收录。
不难验证这里面都是从1到其他顶点的最短路径。
题目中的问题:如果路径按照递增(非递减)顺序生成,真正的最短路径一定经过已经收录的顶点?
反证法:假如到顶点v的最短路径没有经过已经收录的顶点,设经过某点w,则s->w->v就小于s->已收录点->v,而因为我们的生成顺序是递增或非递减的,则因为w还没有被收录进去,所以s->w(小于s->w->v)就不可能比s->v更小(因为我们这次操作已经把v收录进去了)
题目:Dijkstra算法中的dist应该如何初始化?如果s到w有直接的边,则dist[w]=<s,w>的权重;否则dist[w]定义为
-
A. 正无穷
-
B. 负无穷
-
C. -1
-
D. 这三种都可以
选A,因为程序表示
根据里面的不等式,要找路径最小的那个,所以其他边都应该是正无穷。