Appearance
题目
下列选项中,不是如下有向图的拓扑序列的是( )
错因
A
合法序列。可能因为看到 5 出现在 1 之后,担心"5 → 6 链没有连续走完"——但拓扑排序只要求所有前驱已出现,不要求后继紧跟。1、5 都没有前驱,谁先谁后都行;6 在 3 之后再出现也没问题,因为它的前驱只有 5,5 早已出现过。
B
合法序列。常见误判:看到 6 排在 3 前面,误以为 3 必须先于 6。其实 3 和 6 之间没有边,互不依赖;只要各自的前驱(3 需要 1、2;6 需要 5)都已经在序列里出现,先后都合法。
C
合法序列。5、1 同为入度 0 起点,谁先谁后无所谓;其余每个结点出现时其所有前驱也都已经出现过。能被误选通常是把"图里看上去最自然的一条 DFS/BFS 路径"才认作合法序列,但拓扑序的可行解不唯一,所有满足"前驱在前"的排列都算合法。
总解析
判定准则:序列每读到一个结点 , 的所有前驱都必须已经在序列前面出现过。等价地说,把这个序列从左往右扫,每遇到一个结点就把它"出图"(删除它的所有出边),过程中不能出现"要出的结点入度还不为 0"。
先把图的依赖关系列清楚(边方向 = 依赖方向):
| 结点 | 入度 | 前驱集合 |
|---|---|---|
| 1 | 0 | ∅ |
| 5 | 0 | ∅ |
| 2 | 2 | |
| 6 | 1 | |
| 3 | 2 | |
| 4 | 3 |
只有 1 和 5 没有前驱,所以拓扑序的开头必然是 1 或 5。
逐选项检验(每读一个结点,确认其前驱全部已现身):
- A
1, 5, 2, 3, 6, 4:1✓,5✓(无前驱),2 需 {1,5}✓,3 需 {1,2}✓,6 需 {5}✓,4 需 {2,3,6}✓。合法。 - B
5, 1, 2, 6, 3, 4:5✓,1✓,2 需 {1,5}✓,6 需 {5}✓,3 需 {1,2}✓,4 需 {2,3,6}✓。合法。 - C
5, 1, 2, 3, 6, 4:5✓,1✓,2 需 {1,5}✓,3 需 {1,2}✓,6 需 {5}✓,4 需 {2,3,6}✓。合法。 - D
5, 2, 1, 6, 3, 4:5✓,2 需 {1,5}——但 1 还没出现,违反前驱条件。不合法 ✗。
违规的本质原因:图中存在边 1 → 2,所以任何合法拓扑序里 1 都必须排在 2 的前面。D 把 2 放到了 1 之前,等价于在 DAG 上"逆着箭头"走,必然不合法。
最终答案是 D(5, 2, 1, 6, 3, 4)。