图
1
一个简单图的度数序列是将图中所有节点的度数按降序排列得到的序列。以下哪些序列不可能是任何图的度数序列?
I. 7, 6, 5, 4, 4, 3, 2, 1
II. 6, 6, 6, 6, 3, 3, 2, 2
III. 7, 6, 6, 4, 4, 3, 2, 2
IV. 8, 7, 7, 6, 4, 2, 1, 1
解释:
- II (6,6,6,6,3,3,2,2):所有顶点度数之和为 $6+6+6+6+3+3+2+2 = 34$,是奇数,违反了图论中“图的度数和必须为偶数”的基本性质。
- IV (8,7,7,6,4,2,1,1):包含一个度数为 8 的顶点,但整个图仅有 8 个顶点,这意味着该顶点需与其余 7 个顶点相连。然而序列中存在度数为 1 的顶点,其只能与一个顶点相连,无法满足与度数为 8 的顶点的连接需求。
2
考虑一个无向无权图 $G$。从节点 $r$ 开始进行广度优先遍历。设 $d(r, u)$ 和 $d(r, v)$ 分别为图 $G$ 中从 $r$ 到 $u$ 和 $v$ 的最短路径长度。如果在广度优先遍历中 $u$ 比 $v$ 先被访问,以下哪个陈述是正确的?( )
- 当 u 和 v 位于同一 BFS 层时,它们的最短路径长度相等,即 $d(r, u) = d(r, v)$
- 当 u 比 v 更早被访问时,若不在同一层,则 $d(r, u) < d(r, v)$
3
给定一个包含 $n$ 个顶点的集合 $ V = {V₁, V₂, \ldots, Vₙ} $,可以构造出多少个无向图(不一定是连通的)?
( )
解释:
- 在无向图中,顶点集合大小为 $ n $ 时,最多可构造 $ \frac{n(n-1)}{2} $ 条边。
- 对于每一条可能的边,存在两种状态:存在 或 不存在。
- 因此,所有可能的无向图数量等于从 $ \frac{n(n-1)}{2} $ 条边中进行二元选择的组合数: $$ 2^{\frac{n(n-1)}{2}} $$
4
以下关于无向图的陈述中,哪些是正确的?
P: 奇度顶点的数量是偶数
Q: 所有顶点的度数之和是偶数
解析
- P 的正确性:在无向图中,添加一条边会使两个顶点的度数各增加 1。由于每次操作都改变两个顶点的奇偶性,奇度顶点的总数始终为偶数(如从偶数变为偶数 +2 或偶数 -2)。
- Q 的正确性:每条边对总度数的贡献为 2(连接两个顶点),因此所有顶点的度数之和恒等于 $2 \times$ 边数,必然是偶数。即使存在奇数度数的顶点,其总和仍会被偶数个奇数相加抵消(如 $3 + 5 = 8$)。
5
在以下哪种情况下,有向无环图(DAG)最为适用?( )
有向无环图(DAG)的核心特性
- 拓扑排序支持:通过无环结构实现任务顺序排列
- 依赖管理优势:天然适合表达任务间的先后约束关系
- 调度优化能力:可有效进行资源分配与进度规划
DAG 的这些特性使其成为项目管理工具(如甘特图、PERT 图)的基础数据结构,能避免循环依赖导致的逻辑矛盾。
6
在一个具有 $n$ 个顶点的无环无向图中,最多有多少条边?( )
解析:
- 有环图:最大边数为 $ \frac{n(n-1)}{2} $
- 无环图:边数最多的无环图是一个生成树,此时边数为 $ n-1 $
因此,正确答案是 $ n-1 $ 条边。
7
在有向图中,汇点是指一个顶点 i
满足:所有其他顶点 j
≠ i
都有一条边指向 i
,并且 i
没有任何出边。一个包含 n
个顶点的有向图 G
通过邻接矩阵 A
表示,其中 A[i][j] = 1
表示存在从顶点 i
到 j
的边,否则为 0
。以下算法用于判断图 G
中是否存在汇点。
i = 0;
do {
j = i + 1;
while ((j < n) && E1) j++;
if (j < n) E2;
} while (j < n);
flag = 1;
for (j = 0; j < n; j++)
if ((j != i) && E3)
flag = 0;
if (flag)
printf("Sink exists");
else
printf("Sink does not exist");
选择正确的 E3 表达式( ):
以下解释是针对本题前一部分的内容:
要使顶点 i
成为汇点,必须不存在从 i
到任何其他顶点的边。根据题目给出的输入条件,A[i][j]=1
表示存在从 i
到 j
的边,A[i][j]=0
表示不存在该边。对于 i
成为汇点,需要满足:对所有 j
,A[i][j]=0
(无出边),且对所有 j
,A[j][i]=1
(所有其他顶点都指向 i
)。上述伪代码从 i=0
开始检查每个顶点是否为汇点。它实际上会检查 i
之后的所有顶点 j
是否可能成为汇点。该算法的巧妙之处在于不检查 j
小于 i
的情况。循环选出的 i
可能不是汇点,但确保不会忽略潜在的汇点。最终在 do-while
循环后会验证 i
是否真正为汇点。
当 A[i][j]
为 0
时,i
是潜在汇点。因此 E1
应为!A[i][j]
。若此条件不成立,则 i
不是汇点。所有 j<i
也不能是汇点,因为不存在从 i
到 j
的边。此时下一个潜在汇点可能是 j
。所以 E2
应为 i=j
。
关于本题的解释:
以下伪代码验证上述选出的潜在汇点是否确实为汇点。
flag = 1;
for (j = 0; j < n; j++)
if ((j != i) && E3)
flag = 0;
flag=0
表示 i
不是汇点。一旦发现 i
不符合汇点条件,立即设置 flag=0
。若存在任意 j≠i
使得以下任一条件成立,则 i
不是汇点:
- 出边存在:
A[i][j] = 1
(存在从 i 出发的边) - 未被指向:
A[j][i] = 0
(未被其他顶点指向)
因此 E3 应为 (A[i][j] || !A[j][i])
。选项 D 正确。
8
对于下文所示的无向带权图,以下哪一序列的边表示使用 Prim 算法构造最小生成树的正确执行过程?

在 Prim 算法中,我们从任意一个节点开始,不断探索已包含节点的最小成本邻居。具体执行过程如下:
- 初始化:选择任意起始节点(如 d),将其加入生成树集合。
- 迭代扩展:每次从未选边中选择连接已选节点与未选节点的最小权重边。
- 终止条件:当所有节点均被包含时停止。
选项分析:
- 正确选项需满足每一步都选择当前可扩展的最小权重边。
- 选项 C 的边序列
(d, f), (f, c), (d, a), (a, b), (c, e), (f, h), (g, h), (g, i)
符合 Prim 算法的贪心策略。 - 其他选项存在提前选择非最小权重边或跳过必要连接的情况。
9
考虑一个具有 $n$ 个顶点和 $m$ 条边的有向图,其中所有边的权重相同。求该图最小生成树的最佳已知算法的时间复杂度( )?
当图中所有边的权重相等时,最小生成树的构造可通过以下方式实现:
- 深度优先搜索(DFS):通过遍历图构建深度优先树,该树即为有效生成树
- 时间复杂度分析:DFS 的时间复杂度由访问所有顶点(n)和边(m)决定,因此总时间为 O(m+n)
- 结论:此方法在等权图中可直接获得最优解,无需比较权重排序
10
设 G 是一个具有 20 个顶点和 8 个连通分量的简单图。如果我们从 G 中删除一个顶点,那么 G 中的连通分量数量应该介于( )之间。
解析
- 情况 1:如果删除的是 G 中的孤立顶点(即该顶点本身构成一个连通分量),则 G 的连通分量数会减少为 7。
- 情况 2:如果 G 是星型图,则删除其关节点后会得到 19 个连通分量。
因此,G 的连通分量数量应介于 7 到 19 之间。
11
设图 $G$ 有 100 个顶点,编号为 1 到 100。若两个顶点 $i$ 和 $j$ 满足 $|i−j|=8$ 或 $|i−j|=12$,则它们相邻。图 $G$ 中的连通分量数目是( )
当顶点按差值为 12 连接时,连通分量数减少至 4:
- 第一列(1-4)与第五列(9-12)相连
- 第二列(5-8)与第六列(13-16)相连
- 第三列(17-20)与第七列(25-28)相连
- 第四列(21-24)与第八列(29-32)相连
由于差值为 8 的连接关系已被差值为 12 的连接覆盖,所有顶点最终归并为 4 个独立连通分量。因此选项 (B) 正确。
12
给定一个顶点集合 {0, 1, …, n−1} 上的任意固定 n 值的完全无向带权图 G。请画出 G 的最小生成树,当:
a) 边 (u,v) 的权重为 |u−v|
b) 边 (u,v) 的权重为 u + v
13
以下哪种数据结构在通过广度优先搜索遍历给定图时非常有用?( )
解析:
- 广度优先搜索(BFS)执行的是层级遍历
- 使用队列可以很好地实现这一特性
- 队列采用先进先出(FIFO)的顺序
- 先入队的节点会首先被探索,从而保持遍历的顺序
14
在下图中,深度优先搜索(DFS)的发现时间戳和完成时间戳以 x/y 的形式表示,其中 x 是发现时间戳,y 是完成时间戳。它显示了以下哪一个深度优先森林?( )
解析: 根据 DFS 的时间戳规则:
- 发现时间戳 按递增顺序记录首次访问节点的顺序
- 完成时间戳 按递减顺序记录回溯时的节点完成顺序
选项 A 的划分符合以下访问路径:
- 从起点
a
出发,依次访问b → e
- 回溯至
a
后继续访问c → d → h
- 最终访问剩余分支
f → g
该顺序与时间戳的递增/递减规律完全匹配,因此选项 A 正确。
解释
根据 DFS 时间戳规则:
- 发现时间戳较小的节点先被访问
- 完成时间戳较大的节点最后被回溯
选项 A 中的时间戳顺序符合 DFS 遍历的特性。
其他选项均存在时间戳矛盾(如子树完成时间早于父节点发现时间等)。
15
以下哪项是邻接表表示法相对于邻接矩阵表示法在图中的优势?( )
解释:
邻接表表示法具有以下优势:
- 空间效率更高:特别适合稀疏图,节省存储空间。
- 图遍历算法时间复杂度更低:DFS 和 BFS 在邻接表中为 $O(V + E)$,而在邻接矩阵中为 $O(V^2)$。
- 添加新顶点更灵活:相较于邻接矩阵,邻接表更容易扩展顶点数量。
16
考虑下图所示的有向图。从顶点 S 到 T 存在多条最短路径。Dijkstra 最短路径算法会报告哪一条?假设在任何迭代中,只有当发现更短的路径时,顶点 v 的最短路径才会被更新。( )

Dijkstra 算法执行流程解析:
- 当算法处理到顶点
C
时,其邻接顶点D
和E
的临时距离分别被计算为 7 和 6 - 此时优先级队列中最小距离顶点为
E
(距离值 6 < 7) - 根据算法规则,下一步将选择距离最小的顶点
E
进行松弛操作 - 最终通过路径
S → A → C → E → T
构成最短路径 SACET
关键结论:由于 Dijkstra 算法始终选择当前已知最短距离的顶点进行扩展,因此在 C
节点处理阶段会选择距离更小的 E
节点继续搜索
17
在无权图上实现 Dijkstra 最短路径算法以使其运行时间为线性时间时,应使用的数据结构是( ):
在无权图中,最短路径意味着需要遍历的边数最少。 这与所有权重恰好为 1 的加权版本问题相同。如果我们使用 队列(先进先出)而非优先队列(最小堆),则可以在线性时间 $O(|V| + |E|)$ 内得到最短路径。本质上我们通过图的 广度优先搜索(BFS)遍历来获取最短路径。
18
从下图的顶点 a 运行 Dijkstra 单源最短路径算法时,计算出正确的最短路径距离到( ):
Dijkstra 单源最短路径算法不能保证在包含负权边的图中正确工作,但该算法在给定图中有效。
让我们逐步验证:
- 第一次遍历后
- b: 1
- b 是最小值,因此 b 的最短距离为 1。
- 第二次遍历后
- c: 3,e: -2
- e 是最小值,因此 e 的最短距离为 -2
- 第三次遍历后
- c: 3,f: 0
- f 是最小值,因此 f 的最短距离为 0
- 第四次遍历后
- c: 3,g: 3
- 两者相同,选择 g,因此 g 的最短距离为 3
- 第五次遍历后
- c: 3,h: 5
- c 是最小值,因此 c 的最短距离为 3
- 第六次遍历后
- h: -2
- h 是最小值,因此 h 的最短距离为 -2
注意:虽然最终所有顶点都被处理,但由于图中存在负权边(如 e→h 的 -4),Dijkstra 算法理论上无法保证正确性。但在本例中,由于负权边未形成负权环且起点 a 到相关顶点的路径权重始终递增,算法仍能得出正确结果。
19
在一个无权、无向的连通图中,从节点 S 到其他所有节点的最短路径,按时间复杂度而言最高效的是以下哪种方法?( )
Dijkstra 算法
- 时间复杂度:O(|V|² + |E|)
- 适用于有权图
Warshall 算法
- 时间复杂度:O(|V|³)
- 通常用于传递闭包,而非最短路径
DFS
- 不适用于寻找最短路径
BFS
- 时间复杂度:O(|E| + |V|)
- 适用于无权图,能有效找到最短路径
20
假设我们以顶点 P 为源点,在以下边权有向图上运行 Dijkstra 单源最短路径算法。各节点按照什么顺序被加入到最短路径距离已确定的顶点集合中?
答案是 (B)。在 Dijkstra 算法中,每一步我们都会从当前已找到最短路径的顶点集合中,选择一个与其距离最短的顶点,并将连接这两个顶点的边加入到最短路径中。
21
Bellman-Ford 单源最短路径算法在 n 个顶点的完全图上的时间复杂度是多少?
解析:
- Bellman Ford 算法的基本时间复杂度为 Θ(VE)
- V 表示顶点数量
- E 表示边的数量
- 在完全图中,边数 E 满足 E = Θ(V²)
- 代入计算得最终时间复杂度: $$ Θ(V \times V^2) = Θ(V^3) $$
- 因此选项 C 是正确答案。
22
在带权图中,假设使用最短路径算法正确计算了从源点 s 到目标点 t 的最短路径。以下陈述是否成立?( )
如果我们将每条边的权重增加 1,则最短路径始终不变。
请看以下反例说明:
- 原始图结构
四条边及对应权重:- s-a: 1
- a-b: 1
- b-t: 1
- s-t: 4
1 1 1
s-----a-----b-----t
\ /
\ /
\___________/
4
修改前最短路径
路径s-a → a-b → b-t
总权重 = 1 + 1 + 1 = 3修改后权重变化
所有边权重 +1 后:- s-a: 2
- a-b: 2
- b-t: 2
- s-t: 5
修改后路径比较
- 原路径总权重 = 2 + 2 + 2 = 6
- 新路径
s-t
总权重 = 5
结论
修改后原最短路径不再是全局最优解,说明"最短路径始终不变"的陈述不成立。
23
在有向无环图(DAG)中,以下哪种算法可以高效地计算单源最短路径?( )
解析
- 核心原理:拓扑排序利用 DAG 的特性,按拓扑序依次松弛每条边,确保每个节点的最短路径被唯一确定。
- 时间复杂度:$O(V + E)$,这是目前已知针对 DAG 的最优解法。
- 对比其他选项:
- Dijkstra 算法需依赖优先队列,时间复杂度通常为 $O(E \log V)$ 或更高。
- Bellman Ford 算法虽可处理负权边,但时间复杂度为 $O(VE)$,效率较低。
- 强连通分量与最短路径问题无直接关联。
- 应用场景:特别适合任务调度、数据流分析等 DAG 相关问题。
24
关于最短路径,以下陈述是否有效?给定一个图,假设我们已经计算出从源点到所有其他顶点的最短路径。如果我们将图中所有边的权重修改为原始权重的两倍,则最短路径保持不变,仅路径的总权重发生变化。( )
25
将以下内容进行匹配
组 A | 组 B |
---|---|
a) Dijkstra 单源最短路径算法 | p) 动态规划 |
b) Bellman Ford 单源最短路径算法 | q) 回溯法 |
c) Floyd Warshall 所有点对最短路径算法 | r) 贪心算法 |
- Dijkstra 算法:采用贪心算法,通过每次选择未确定最短路径的顶点中距离最小的节点进行扩展。
- Bellman Ford 算法:基于动态规划,通过松弛操作逐步更新最短路径估计值。
- Floyd Warshall 算法:同样属于动态规划,利用矩阵迭代计算所有点对之间的最短路径。
26
以下陈述是否有效?在所有边权重均唯一的加权图中(任意两条边的权重不同),从源点到目标点的最短路径总是唯一的( )。
- 一条单边权重为 5 的路径
- 另一条由权重 2 和 3 组成的双边路径
它们的总权重相同(2 + 3 = 5)
27
以下陈述是否有效?给定一个所有边权均为正的图,Dijkstra 算法和 Bellman-Ford 算法生成的最短路径可能不同( ),但路径权重始终相同。
- Dijkstra 算法:基于贪心策略,每次选择当前距离最小的节点进行松弛操作,优先保证局部最优解。
- Bellman-Ford 算法:通过动态规划迭代所有边,逐步更新最短路径估计值,允许全局调整。
- 结论:两种算法虽然计算路径的方式不同,但在无负权边的情况下,最终得到的最短路径权重必然一致。但由于路径选择策略差异,实际经过的边可能不同。
28
以下关于 Bellman-Ford 最短路径算法的陈述中,哪些是正确的?
P: 如果存在负权环,则总是能检测到。
Q: 检测是否存在从源点可达的负权环。
Bellman-Ford 最短路径算法是单源最短路径算法。因此它只能检测从给定源点可达的负权环,而非图中所有可能存在的负权环。考虑一个不连通图,其中某个负权环完全无法从源点到达的情况。
如果存在负权环,则在最短路径计算中会体现出来——因为每次经过该环都会使路径长度不断减小。
29
设 $G(V, E)$ 是一个具有正边权的无向图。使用二进制堆数据结构实现 Dijkstra 单源最短路径算法的时间复杂度为( ):
在使用**二进制堆(Binary Heap)**实现的 Dijkstra 算法中,时间复杂度主要来自两部分操作:
- 取出当前距离最小的顶点:最多执行 $|V|$ 次,每次操作代价是 $\log|V|$,总共是 $O(|V| \log|V|)$。
- 更新邻接点的距离:最多执行 $|E|$ 次,每次操作代价是 $\log|V|$,总共是 $O(|E| \log|V|)$。
所以总时间复杂度为:
$$O(|V| \log|V| + |E| \log|V|) = O((|E| + |V|) \log|V|)$$
30
设 $G(V, E)$ 是一个包含 $n$ 个顶点的有向图。$G$ 中从 $v_i$ 到 $v_j$ 的路径是顶点序列 $(v_i, v_{i+1}, \cdots, v_j)$,满足对所有 $k \in [i, j-1]$,$(v_k, v_{k+1}) \in E$。简单路径是指路径中不包含重复顶点的路径。
设 A 为一个 n×n 数组,初始化如下。考虑以下算法:
for i = 1 to n
for j = 1 to n
for k = 1 to n
A[j, k] = max(A[j, k], A[j, i] + A[i, k]);
在上述算法执行结束后,以下哪项陈述对于所有 j 和 k 必然成立?( )
解析
在原始输入矩阵中,若存在从 j
到 k
的边则 A[j, k]=1
,否则为 0。
关键分析步骤:
算法本质
表达式A[j, k] = max(A[j, k], A[j, i] + A[i, k])
实际上是在计算从 j 到 k 的路径中经过中间节点 i 的最大边数。每次迭代时,算法尝试通过新增的中间节点 i 来延长已知路径。数值含义
-
初始状态:A[j,k]
表示是否存在直接边(1
或0
)-
迭代过程:A[j,k]
最终表示从j
到k
的最长路径所含的边数-
上界约束:由于简单路径不能重复顶点,最长路径至多包含n-1
条边结论推导
-
当A[j,k] = n-1
时,说明存在一条长度为n-1
的简单路径(覆盖所有顶点)-
若A[j,k] ≥ n
,则必然存在环(因为简单路径最多n-1
条边)-
因此 D 选项表述了"
简单路径最多包含A[j,k]
条边"
这一必然成立的关系错误选项排除
- A 错误:当存在环时
A[j,k]
可能超过 n - B 错误:
A[j,k] ≥ n-1
仅说明存在长度为 n-1 的路径,但不足以证明存在哈密顿回路 - C 错误:算法求的是最长路径的边数,而非路径长度(权重总和)
- A 错误:当存在环时
31
设 $G = (V, E)$ 是一个简单无向图,$s$ 是其中的一个特定顶点(称为源点)。对于 $x \in V$,用 $d(x)$ 表示从 $s$ 到 $x$ 在 $G$ 中的最短距离。从 $s$ 开始执行广度优先搜索(BFS),得到一棵 BFS 树 $T$。若 $(u, v)$ 是 $G$ 的一条不在 $T$ 中的边,则以下哪一项不可能是 $d(u)-d(v)$ 的值?( )
注意:给定的图是无向的,因此边 (u, v) 也意味着 (v, u) 是一条边。
解释:
在无向图中,BFS 构建的最短路径树具有以下性质:
- 非树边的特性:若边 (u, v) 不在 BFS 树 T 中,则 u 和 v 必须属于同一层或相邻层。
- 距离差限制:
- 若 u 和 v 属于同一层(即 d(u) = d(v)),则差值为 0。
- 若 u 和 v 属于相邻层(如 d(u) = d(v) + 1 或 d(v) = d(u) + 1),则差值为 ±1。
- 矛盾性分析:
- 若假设 d(u) – d(v) = 2,则存在更短路径通过边 (u, v) 直接连接 u 和 v,这与 BFS 树定义的最短路径性质矛盾。
因此,在无向图中,非树边两端点的距离差绝对值不可能超过 1。
32
设 $G$ 是一个有向图,其顶点集是 $1$ 到 $100$ 的数字集合。若从顶点 $i$ 到顶点 $j$ 存在边,则当且仅当 $j = i + 1$ 或 $j = 3i$ 时成立。从顶点 $1$ 到顶点 $100$ 的路径中,最少需要多少条边?( )
任务是从顶点 1 到顶点 100 寻找路径中边数最少的方案,其中可以从顶点 i 移动到 i+1 或 $3 \times i$。由于目标是最小化边数,
我们更倾向于选择 $3 \times i$ 的路径。
正向尝试 3 的倍数路径
1 → 3 → 9 → 27 → 81,此时无法继续使用 $3 \times i$ 路径,只能使用 i+1。这种方案会导致较长的路径。反向从终点开始的策略
若数值不是 3 的倍数则减 1,否则除以 3:
100 → 99 → 33 → 11 → 10 → 9 → 3 → 1因此总共需要 7 条边。
33
考虑一个包含 $4$ 个顶点的带权无向图,其中边 ${i, j}$ 的权重由矩阵 $W$ 中的元素 $W_{i,j}$ 给出。使得至少存在某对顶点之间的最短路径中包含权重为 $x$ 的边的最大可能整数值是( )。
设顶点为 0、1、2 和 3。
x 直接连接顶点 2 和 3。不经过 x 的情况下,从 2 到 3 的最短路径权重为 12(路径为 2-1-0-3
)。
当 x 的值大于 12 时,路径 2-3
的直接边权重会超过替代路径 2-1-0-3
的总权重(12),此时最短路径将不再包含权重为 x 的边。因此,x 的最大取值为 12,此时仍满足存在最短路径包含该边的条件。
34
考虑一个具有正边权的带权无向图,设 $uv$ 是图中的一条边。已知从源顶点 $s$ 到 $u$ 的最短路径权重为 $53$,从 $s$ 到 $v$ 的最短路径权重为 $65$。以下哪一项陈述始终成立?( )
根据三角不等性原理:
- 若存在路径 $s \rightarrow \cdots \rightarrow u \rightarrow v$,则满足 $d(s,u) + w(u,v) \geq d(s,v)$
- 已知 $d(s,u)=53$,$d(s,v)=65$
- 代入不等式得:$53 + w(u,v) \geq 65$
- 推导结果:$w(u,v) \geq 12$
35
以下哪种算法用于解决所有节点对的最短路径问题?( )
- Prim 算法:用于求解给定图的最小生成树(MST)。
- Dijkstra 算法:用于在有权图中从源点到其他所有节点的最短路径。
- Bellman-Ford 算法:用于在可能包含负权边的图中求解从源点到其他所有节点的最短距离。
- Floyd-Warshall 算法:它是一种所有节点对的最短路径算法,用于求解每对顶点之间的最短距离。
因此,选项(D)正确。
36
以下哪种数据结构在使用广度优先搜索遍历给定图时非常有用( )?
解析:
队列(先进先出/FIFO)是广度优先搜索(BFS)的核心数据结构。
- BFS 的核心特性是逐层遍历,即从起始节点出发,优先访问当前层级的所有相邻节点后再进入下一层级。
- 队列遵循 FIFO(First In First Out) 原则,能够保证节点按层级顺序依次被访问:
- 先入队的节点会先被处理,其邻接节点随后入队;
- 后入队的节点则等待前序节点处理完成后再处理,从而维持遍历的层次性。
- 相比之下,栈(LIFO)更适合深度优先搜索(DFS),而列表缺乏严格的顺序约束机制。
37
设 $G=(V,E)$ 是一个有向加权图,权重函数为 $w:E→R$。对于某个映射 $f:V→R$,对每条边 (u,v)∈E,定义 $w’(u,v)$=w(u,v)+f(u)−f(v)。以下哪个选项能补全下述句子使其成立?“在 $G$ 中基于 $w$ 的最短路径,在 $w’$ 下也是最短路径,( )”。
A
- 将顶点映射到任意实数值时,最短路径保持不变。
- 任何路径上的中间节点值都会相互抵消,最终仅剩起点和终点的值,其总和即为路径成本。
- 因此最短路径保持一致。
关键分析
- D 选项错误在于"当且仅当"的表述。若改为单纯的"如果"则正确。
- 给出的条件是充分而非必要条件,使得"仅当"部分无效。
- 本质上这意味着所有顶点的势能都为 0(因为它们与新顶点 s 通过零权重边相连)。
- B 和 C 选项也因相同原因错误(正负数限制并非必要条件)。
38
在给定一个所有边权重相同的有向图中,我们可以使用以下哪种方法高效地找到从给定源点到目标点的最短路径?( )
解析
通过广度优先遍历(BFS),我们首先探索距离为一条边的顶点,然后是距离为两条边的所有顶点,依此类推。
39
图的遍历与树的不同之处在于( )。
图的深度优先遍历(DFS)类似于树的深度优先遍历。唯一的区别在于,与树不同,图可能包含循环(节点可能被重复访问)。为了避免对同一节点进行多次处理,需要使用布尔型已访问数组。图可以有多个不同的 DFS 遍历路径。因此选项(A)是正确答案。
40
以下算法适用的数据结构是什么?
- 广度优先搜索
- 深度优先搜索
- Prim 最小生成树
- Kruskal 最小生成树
广度优先搜索使用队列,深度优先搜索使用栈,Prim 最小生成树使用优先队列。Kruskal 最小生成树使用并查集。因此选项 (B) 是正确答案。
41
广度优先搜索算法使用队列数据结构实现。访问以下图中节点的一个可能顺序是( )。
选项 (A) 的顺序为 MNOPQR。由于遍历从 M 开始,但 O 在 N 和 Q 之前被访问,这不符合广度优先搜索的规则(当前深度的所有相邻节点必须在下一层深度的节点前被访问)。选项 (B) 的顺序为 NQMPOR。这里 P 在 O 之前被访问,同样违反了 BFS 规则。选项 (C) 和 (D) 的前缀 QMNP 符合 BFS 特性。观察到 M 在 N 和 P 之前被加入队列(因为 QMNP 中 M 出现在 NP 前),而 R 是 M 的邻居节点,因此会在 N 和 P 的邻居节点(即 O)之前被加入队列。最终 R 会先于 O 被访问。因此,选项 (C) 是正确答案。
42
设 G 为一个无向图。考虑对 G 进行深度优先遍历,得到的深度优先搜索树为 T。假设 u 是 G 中的一个顶点,v 是在遍历中访问完 u 之后第一个被访问的新(未访问过)顶点。以下哪项陈述始终成立?
在 DFS 中,若’v’在’u’之后被访问,则以下两种情况必居其一:
- (u, v) 是一条边。
u
/ \
v w
/ / \
x y z
- ‘u’ 是叶节点。
w
/ \
x v
/ / \
u y z
在 DFS 中,访问完一个节点后,会先递归访问所有未访问过的子节点。如果没有未访问的子节点(u 是叶节点),则控制权返回到父节点,父节点再访问下一个未访问的子节点。因此选项 (C) 是正确答案。
43
以下哪种条件足以检测有向图中的环?
通过深度优先遍历(DFS)技术可以检测有向图中的环。其核心思想是:只有当图中存在回溯边(即某个节点指向其祖先节点)时,才会形成环。为了检测回溯边,需要跟踪两个状态:1)已访问过的节点集合;2)当前递归调用栈中的节点集合(即当前正在访问的路径)。如果在递归过程中遇到一个已经在当前递归栈中的节点,则说明存在环。对于不连通的图,需要先获取 DFS 森林,然后对每棵树单独检查是否存在回溯边。因此选项 (B) 是正确答案。
44
以下陈述是否正确/错误:如果一个有向图的深度优先搜索(DFS)包含回边,那么该图的任何其他深度优先搜索也会至少包含一条回边。
回边表示图中存在环。因此,如果图中存在环,所有深度优先搜索都会至少包含一条回边。
45
Make 是一个工具,它通过读取名为 makefiles 的文件自动从源代码构建可执行程序和库。这些文件指定了如何推导目标程序。以下哪种标准图算法被 Make 使用?
Make 可以通过拓扑排序确定软件的构建顺序。拓扑排序会根据 makefile 中提供的所有依赖关系生成顺序。详情请参见:拓扑排序。因此选项 (B) 是正确答案。
46
在图中给定两个顶点 s 和 t,以下哪种遍历方式(BFS 和 DFS)可以用来判断是否存在从 s 到 t 的路径?
我们可以通过这两种遍历方式来判断是否存在从 s 到 t 的路径。因此选项 (C) 是正确答案。
47
以下陈述是否正确?有向图的深度优先搜索(DFS)总是产生相同数量的树边,即与顶点进行 DFS 的顺序无关。
该陈述是错误的。在有向图中进行深度优先搜索(DFS)时,生成的树边数量可能因顶点考虑顺序的不同而变化。DFS 树中的树边数量取决于 DFS 期间所采取的具体遍历路径。从特定源顶点开始的 DFS 会通过系统化的方式探索邻接顶点,访问邻接顶点的顺序会影响 DFS 树的形成。因此选项 (B) 是正确答案。
48
如果在有向图 G 中,两个顶点 u 和 v 的 DFS 结束时间满足 f[u] > f[v],并且它们属于同一棵 DFS 树(即 DFS 森林中的同一棵树),那么 u 在深度优先树中是 v 的祖先。
49
考虑下图所示的有向无环图(DAG),其中顶点集合 V = {1, 2, 3, 4, 5, 6}。以下哪一项不是该图的拓扑排序?
在选项 D 中,顶点 1 出现在顶点 2 和 3 之后,这违反了拓扑排序的基本规则。根据题目中的 DAG 可以直接观察到,顶点 1 存在指向顶点 2 和 3 的出边,因此顶点 2 和 3 必须出现在顶点 1 之前。显然选项 D 不符合拓扑排序的要求。对于无法直观判断的情况,我们需要掌握如何通过算法确定 DAG 的拓扑排序。综上所述,选项 (D) 是正确答案。
50
考虑从源节点 W 开始的无权、连通、无向图中的广度优先搜索(BFS)遍历的树边。由这些树边构成的树 T 是用于计算以下哪一项的数据结构?
解释:正确答案是 (B) 从 W 到图中每个顶点的最短路径。在无权、连通、无向图中,从源节点 W 进行广度优先搜索(BFS)遍历时,由树边构成的树 T 表示了从 W 到图中其他所有顶点的最短路径。BFS 按层级探索图,从源节点 W 开始,遍历过程中会按照与 W 的距离递增的顺序发现顶点。树 T 中的树边代表了从 W 到每个顶点的最短路径,因为 BFS 确保顶点是按照其与源节点的距离顺序被访问的。选项 (A) 错误,因为树 T 仅表示从 W 出发的最短路径,而非图中任意两顶点间的最短路径。选项 (C) 也不正确,BFS 生成的树 T 包含所有从 W 可达的顶点(而不仅仅是叶子节点),且无论顶点是否为叶子或内部节点,都表示最短路径。选项 (D) 错误,BFS 不提供关于最长路径的信息,它专注于寻找从源节点 W 到其他顶点的最短路径。因此,正确答案是 (B)。
51
假设从某个未知顶点开始对下图执行深度优先搜索。假定仅在首先确认顶点尚未被访问过的情况下才进行递归调用。那么可能的最大递归深度(包括初始调用)是( )。
下图展示了递归树具有最大深度的最坏情况。因此,递归深度为 19(包括第一个节点)。
52
设 T 是无向图 G 的深度优先搜索树。顶点 u 和 n 是该树 T 的叶子节点。u 和 n 在 G 中的度数至少为 2。以下哪项陈述是正确的?
以下示例说明了 A、B、C 都是错误的,所以正确选项为 D。

53
在对具有 n 个顶点的图 G 进行深度优先遍历时,标记了 k 条树边。图 G 中的连通分量数量是:
树边是深度优先搜索树中包含的边。如果一棵树中有 x 条树边,则该树包含 x+1 个顶点。
当图不连通时,DFS 的输出是一片森林。
- 所有顶点都连通的情况。此时 k 必须等于 n-1。根据公式计算得连通分量数为 n-k = n-(n-1)=1
- 没有任何顶点连通的情况。此时 k 必须等于 0。根据公式计算得连通分量数为 n-k = n-0=n
54
考虑以下有向图。该图的顶点具有多少种不同的拓扑排序顺序?注意:此问题以数值型题目形式提出。
以下是六种不同的拓扑排序:
a-b-c-d-e-f
a-d-e-b-c-f
a-b-d-c-e-f
a-d-b-c-e-f
a-b-d-e-c-f
a-d-b-e-c-f
55
设 $G = (V, G)$ 是一个带权无向图,且使用邻接表维护其最小生成树(MST)$T$。若在 $G$ 中新增一条边 $(u, v) \in V×V$,则判断 $T$ 是否仍为新图的 MST 的最坏时间复杂度是:
在一个所有边权重互异的图中,广度优先搜索(BFS)不能直接用于此目的。以下是替代方法:对于包含 V 个顶点的最小生成树(MST),其边数为 V−1 条。遍历邻接表的时间复杂度为 O(V+E),但由于我们处理的是 MST 的 V−1 条边,因此实际遍历时间为 O(V)。题目给出的是 MST 而非完整图,且 MST 中 E=V-1,故时间复杂度 TC = Θ(V + E) = Θ(V + V-1) = Θ(V)。在遍历 MST 的邻接表时,将新添加边的权重与 MST 中现有边的权重进行比较。若新边权重更小,则需更新 MST;否则无需修改。因此该过程的时间复杂度为 O(V)。
56
在一个连通图中,关键点(割点)是指删除该顶点及其关联边后,图会被分割成两个或更多连通分量的顶点。设 T 是通过在连通无向图 G 中进行深度优先搜索(DFS)得到的 DFS 树。以下哪个选项是正确的?
我们逐一验证所有选项:
选项 (A):T 的根节点在 G 中永远不可能是关键点。此选项 错误。观察下图 G 的 DFS 树 T:
r
/ \
a b
当根节点可以成为关键点时,删除与 T 根节点对应的顶点会将图分割为两个连通分量。因此,T 的根节点在 G 中可能成为关键点。
选项 (B):T 的根节点在 G 中是关键点当且仅当它有两个或更多子节点。此选项 正确。根据上述示例及以下树结构:
r
/ \
a b
若 T 的根节点只有一个子节点,则删除其对应顶点不会使图 G 分割为两个或更多连通分量。因此,T 的根节点至少需要有两个子节点才能成为关键点。
选项 (C):T 的叶子节点在 G 中可能是关键点。此选项 错误。如下图 T 所示:
p
/
q
任何叶子节点仅连接到父节点。删除该叶子节点不会导致图 G 分割为多个连通分量。因此,T 的叶子节点不可能是关键点。
选项 (D):如果 u 是 G 中的关键点,并且在 T 中 x 是 u 的祖先,y 是 u 的后代,则 G 中从 x 到 y 的所有路径都必须经过 u。此选项 错误。考虑图 G 的示例:
x - w - v - y
\ /
u u
在通过 DFS 得到的树 T 中,u 是 G 的关键点,x 是 u 的祖先,y 是 u 的后代。尽管满足条件,但存在不经过 u 的路径(如 x→w→v→y)。因此,只有选项 B 正确。
57
考虑一个包含 7 个节点的完全二叉树。设 A 是从根节点开始进行广度优先搜索(BFS)所获得的前 3 个元素的集合,B 是从根节点开始进行深度优先搜索(DFS)所获得的前 3 个元素的集合。|A−B| 的值是( )。
考虑一棵完全二叉树,共有 3 层,总共有 7 个元素。每层的元素数量如下:
- 第 1 层:1 个元素
- 第 2 层:2 个元素
- 第 3 层:4 个元素
广度优先搜索(BFS)
进行 广度优先搜索 时,定义集合 A 包含第 1 层和第 2 层的所有元素:
- 第 1 层:第一个元素
- 第 2 层:第二个和第三个元素
因此:
- A = { 第 1、2、3 个元素 }
深度优先搜索(DFS)
进行 深度优先搜索 时,定义集合 B 包含:
- 第 1 层:第一个元素
- 第 2 层:第二个元素
- 第 3 层:第三个元素
因此:
- B = { 第 1、2、4 个元素 }
集合运算分析
- A ∩ B 包含 1 个元素(第 1 层的根节点)
- A - B 表示 A 中不属于 B 的元素,即 第 2 层中剩下的那个元素
结论
|A - B| = 1
58
对于一个给定的图 $G$,它有 $v$ 个顶点和 $e$ 条边,并且是连通的且没有环路。以下哪项陈述是正确的?
该图 G 是连通且无环路(也称为无循环)的树结构。根据树的定义,其边数 (e) 始终等于顶点数 (v) 减 1,即 e = v - 1 或等价地 v = e + 1。因此选项 (C) 为正确答案。
59
以下哪项陈述是正确的?
P1: 每棵树始终都是图。
P2: 每个图始终都是树。
P3: 每棵树都是图,但并非每个图都是树。
P4: 每个图都是树,但并非每棵树都是图。