Skip to content

2016年 408 数据结构 第 8 题

数据结构2016年选择题2分

题目

使用迪杰斯特拉(Dijkstra)算法求下图中从顶点 1 到其他各顶点的最短路径,依次得到的各最短路径的目标顶点是( )。

5422967625123456

错因

A

前三步(5, 2, 3)算对了,但漏掉了 3 → 6 这条出边。在第四轮选取最近顶点时,正确做法是先用 3 的出边更新 ,再比较 选 6。如果忘了更新 仍为 ,那剩下未选顶点中只有 是有限值,自然误选 4。错的不在 Dijkstra 流程,而在"加入新顶点后必须用它的所有出边松弛"这一步。

C

第二步(选完 2)之后漏掉了 2 → 3 的松弛。本应通过 2 把 更新为 ,但选 C 的人没做这步,结果 仍是 ,比较时只看 是唯一有限值,误把 4 当成第三近。本质和 A 是同一类错误的不同位置:每加一个新顶点都必须用它的出边更新所有可达邻居。

D

第二步算 2 是对的,但第三步直接跳到 6,跳过了 3。可能的思路是混淆了"路径"和"目标"——把""或""看成最短路径,但事实上图里没有 这种直达边,到 6 必须经 3。也可能把 错算成 等错的中间值。Dijkstra 第三步的关键是按 值大小选最小的未访问顶点,不能跳号选

总解析

Dijkstra 算法:从源点开始,每轮"贪心"选取当前 值最小的未访问顶点 加入已确定集 ,然后用 的所有出边松弛 的邻居。重复直到所有顶点入

初始化,其它顶点

逐轮模拟

第 1 轮:未访问中 最小的是 1()。加入 1 到

用 1 的出边 更新:

顶点123456
0 ✓54

第 2 轮:剩余中 最小是 5()。第 1 个被选定的目标:5

用 5 的出边 更新:

顶点123456
0 ✓5114 ✓

第 3 轮:剩余中 最小是 2()。第 2 个:2

用 2 的出边 更新:

顶点123456
0 ✓5 ✓7114 ✓

第 4 轮:剩余中 最小是 3()。第 3 个:3

用 3 的出边 更新:

顶点123456
0 ✓5 ✓7 ✓114 ✓9

第 5 轮:剩余 4()和 6()。第 4 个:6)✓

用 6 的出边 更新:无变化。

第 6 轮:只剩 4()。第 5 个:4

最终选取顺序

关键易错点:第 4 轮选最小时,必须先用 3 的出边松弛 (从 降到 9),再和 比较。如果跳过这一步,就会得到选项 A 的错误顺序。

最终答案是 B(5, 2, 3, 6, 4)

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数