Skip to content

2012年 408 数据结构 第 7 题

数据结构2012年选择题2分

题目

对如下有向带权图,若采用迪杰斯特拉(Dijkstra)算法求从源点 a 到其他各顶点的最短路径,则得到的第一条最短路径的目标顶点是 b,第二条最短路径的目标顶点是 c,后续得到的其余最短路径的目标顶点依次是( )。

2531341141abcdef

错因

A

按节点编号 d, e, f 顺序"猜"。可能没注意到 c→f 这条短边(权 1),以为 f 离起点最远应该最后被确定。但 Dijkstra 是"按 值贪心选择",不按图上的物理远近——通过 c 转一下,f 的距离只有 4,比 d (5) 和 e 都近。

B

把 e 排在 d 前面。可能想:从 c 出发 c→e=4 直接松弛到 d[e]=7,看着 e 准备好了。但只有当一个节点的 d 值是当前未确定集合中的最小值才能被选中,d[e]=7 比 d[f]=4 大、比 d[d]=5 也大,e 必须排在最后。

D

把 d 和 e 的先后弄反。e 的 d 值只有等到 d 被确定后通过 d→e:1 松弛才会从 7 缩到 6(也就是 d[e]=5+1=6)。d 必须先于 e 被选中,所以 d 应该在 e 之前。选 D 等于忽略了"d 节点是 e 的关键中转"。

总解析

Dijkstra 算法核心:维护数组 (已知 a 到 v 的最短距离),每轮挑出未确定节点中 值最小者固化进结果集("被确定"),并用它松弛邻居。

逐轮模拟

轮次本轮选中松弛说明
初始0
1a (0)025a→b:2, a→c:5
2b (2)0235b→c:1(路径 a→b→c=3 比直走 a→c=5 短);b→d:3
3c (3)023574c→f:1(3+1=4);c→e:4;c→d:3(5 仍最优不更新)
4f (4)023574f 没有出边可松弛
5d (5)023564d→e:1(5+1=6 比 7 短)
6e (6)023564全部确定

确定顺序:a → b → c → f → d → e

关键反直觉点:f 在图上看着"最远",但有 c→f:1 这条短边,经 b→c 之后只需再走 1 就到 f,总距离 4,比 d (5) 和 e (6) 都早确定。Dijkstra 按 值贪心而不按物理位置。

题目说前两条已知(b、c),后续依次是 f, d, e

最终答案是 C

最短路径树(高亮路径,灰化无关边):

2531341141abcdef

最后更新:

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

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