数据结构 Dijkstra算法

全部每周作业和视频思考题答案和解析 见 浙江大学 数据结构 思考题+每周练习答案汇总

虽然浙大的数据结构视频在前面讲的都很简单,但是讲到Dijkstra算法时,在课程中看到这样的解释我的内心是很懵逼的:

数据结构 Dijkstra算法_第1张图片

所以我还是画个图来看看怎么操作的吧,就用课程里的例子:

 数据结构 Dijkstra算法_第2张图片

假设我们要找到v1到v6的最短路径,

建立一个dis数组,为了方面描述,坐标设为从1到7。鉴于没有负数,我们设还没遍历到的点为-1。

从1出发,1到1不需要任何路程,设为0。然后1可以到2或者到4,这里要注意的是我们选里面最小的作为确定路径

第一轮:因为大家可以假设,你从1出发,到4需要路程为1,到2需要路程为2,也就是说,如果你再从2蹦到4,值一定比直接到4大。把1和4标记出来。

数据结构 Dijkstra算法_第3张图片

数据结构 Dijkstra算法_第4张图片

第二轮:从v4可以到v3,v5,v6,v7,先都写下来,从v1到v2是里面最小的,我们把2进行收录。:

数据结构 Dijkstra算法_第5张图片

第三轮:从v2出发,可以到v4和v5,v4已经收录了,从v1经过v2到v5的距离为12,大于之前的3,所以不记录进去。我们收录里面最小的v3。

数据结构 Dijkstra算法_第6张图片

第四轮:从v3出发,只能到v6,总路径为8,小于之前经过v4到v6的9,所以我们把8记录进去,收录里面最小的v5:

数据结构 Dijkstra算法_第7张图片

第五轮:从v5出发,只能到v7,总路径为9,大于之前的5,所以不记录进去,收录v7.

数据结构 Dijkstra算法_第8张图片

第六轮:从v7出发,能到v6,距离为6,小于8,所以记录6,并把v6收录。

数据结构 Dijkstra算法_第9张图片

不难验证这里面都是从1到其他顶点的最短路径。

题目中的问题:如果路径按照递增(非递减)顺序生成,真正的最短路径一定经过已经收录的顶点?

反证法:假如到顶点v的最短路径没有经过已经收录的顶点,设经过某点w,则s->w->v就小于s->已收录点->v,而因为我们的生成顺序是递增或非递减的,则因为w还没有被收录进去,所以s->w(小于s->w->v)就不可能比s->v更小(因为我们这次操作已经把v收录进去了)

题目:Dijkstra算法中的dist应该如何初始化?如果s到w有直接的边,则dist[w]=的权重;否则dist[w]定义为

  • A. 正无穷

  • B. 负无穷

  • C. -1

  • D. 这三种都可以

选A,因为程序表示

数据结构 Dijkstra算法_第10张图片

根据里面的不等式,要找路径最小的那个,所以其他边都应该是正无穷。

 

你可能感兴趣的:(算法)