Appearance
题目
对如下所示的有向图进行拓扑排序,得到的拓扑序列可能是()
错因
A
把 2 排在 4 之前——但 4 → 2 这条边要求 4 必须先于 2 输出。该序列违反这条依赖。
末尾 5、6 的顺序也错:6 → 5 要求 6 先于 5。
B
把 2 排在 4 之前,违反 4 → 2,与 A 同病。末尾 6、5 顺序对了,但前面的依赖错破坏了整个序列。
C
把 5 排在 6 之前——但 6 → 5 要求 6 必须先于 5 输出。这个错误最容易在"看到 2、4、5、6 的局部时只关心 2 → 5 这条边"时发生,漏掉了同样指向 5 的另一条 6 → 5。
总解析
步骤一:从图读出邻接表 + 入度表。
| 顶点 | 出边目标 | 入度(指向它的边数) |
|---|---|---|
| 1 | 2, 4 | 1(来自 3) |
| 2 | 5 | 2(来自 1、4) |
| 3 | 1, 6 | 0 ← 起点 |
| 4 | 2, 6 | 1(来自 1) |
| 5 | — | 2(来自 2、6) |
| 6 | 5 | 2(来自 3、4) |
步骤二:拓扑排序逐步删除入度 0 的点。
| 轮 | 入度 0 的点(候选) | 选择 | 移除其出边后剩余入度 |
|---|---|---|---|
| 1 | 3 | 1: 0, 6: 1(少了来自 3 的边) | |
| 2 | 1 | 2: 1, 4: 0, 6: 1 | |
| 3 | 4 | 2: 0, 6: 0(少了来自 4 的边) | |
| 4 | 2 | 5: 1 | |
| 5 | 6 | 5: 0 | |
| 6 | 5 | — |
得到序列:3, 1, 4, 2, 6, 5。
关键节点:第 4 轮的二选一。{2, 6} 谁先都行——
- 选 2 先 → 3, 1, 4, 2, 6, 5(= 选项 D)✓
- 选 6 先 → 3, 1, 4, 6, 2, 5(不在选项中,但同样合法)
而 3, 1, 4 是被强制的前三个:
- 第 1 轮只有 3 入度 0 → 3 必为首
- 第 2 轮只有 1 入度 0(4、6 都还有来自 1 的入边或来自 3 的入边等待去除)→ 1 必为第 2
- 第 3 轮只有 4 入度 0(2 还有来自 4 的入边)→ 4 必为第 3
判别选项是否合法的快捷方法:把每条有向边 在选项序列里找位置,看是否 u 出现先于 v。一条违反就立即否决。
- A:4→2,但 2 在 4 前 ✗
- B:同 A 的 4→2 错 ✗
- C:6→5,但 5 在 6 前 ✗
- D:8 条边逐一验证全部满足 ✓
最终答案是 D(3, 1, 4, 2, 6, 5)。