第15讲 图的遍历 课堂互动 隐藏答案 | 返回首页

作者:欧新宇(Xinyu OU)

最后更新:2023-11-30


【课前自测15】

1. 若从无向图的任意顶点出发进行一次深度优先搜索即可访问所有顶点,则该图一定是()。
A. 强连通图
B. 连通图
C. 有回路
D. 一棵树

答案及解析:B
强连通图是有向图,与题意矛盾,选项A错误;对无向连通图做一次深度优先搜索,可以访问到该连通图的所有顶点,选项B正确;有回路的无向图不一定是连通图,因为回路不一定包含图的所有结点,选项C错误;连通图可能是树,也可能存在环,选项D错误。

2. 对有n 个顶点、e条边的图采用邻接矩阵表示时,进行BFS遍历的时间复杂度为()。
A. O(n²)
B. O(e)
C. O(n+e)
D. O(e²)

答案及解析:A
采用邻接矩阵表示时,查找一个顶点所有出边的时间复杂度为O(n),共有n个顶点,故时间复杂度均为O(n²)。

3. 对一个有n个顶点、e条边的图采用邻接表表示时,进行DFS遍历的时间复杂度为和空间复杂度分别为:()。
A. O(n+e) O(n)
B. O(n+e) O(e)
C. O(n) O(n)
D. O(n) O(e)

答案及解析:A
深度优先遍历时,每个顶点表结点和每个边表结点均查找一次,每个顶点递归调用一次,需要借助一个递归工作栈;而广度优先遍历时,也是每个顶点表结点和每个边表结点均查找一次,每个顶点进入队列一次。因此,两种遍历方法的时间复杂度都是O(n+e),空间复杂度都是O(n)。

4. 对于一个非连通无向图G,采用深度优先遍历访问所有顶点,在DFSTraverse 函数(深度优先遍历函数)中调用DFS的次数正好等于()。
A. 顶点数
B. 边数
C. 连通分量数
D. 不确定

答案及解析:C
DFS(或BFS) 可用来计算图的连通分量数,因为一次遍历必然会将一个连通图中的所有顶点都访问到,而对于已被访问的顶点将不再调用DFS。因此,故计算图的连通分量数正好是DFS遍历函数被调用的次数。

5. 用邻接表存储的图的深度优先遍历算法类似于树的()。
A. 中序遍历
B. 先序遍历
C. 后序遍历
D. 按层次遍历

答案及解析:B
图的深度优先搜索类似于树的先根遍历,也即二叉树的先序遍历。在访问一个结点之后,会先访问该结点的第一个邻接结点,然后再以同样的方式访问邻接结点,以此类推。当某结点不存在邻接结点时,执行回退操作,并检查回退后的结点是否存在邻接结点,若存在则按照深度优先的方式进行遍历,若不存在邻接结点则继续执行回溯。因此,使用邻接表存储的图的深度优先遍历算法类似于树的先序遍历。

【课堂互动15.1】深度优先搜索

1. 对有n个顶点、e条边的图采用邻接矩阵表示时,进行DFS遍历的时间复杂度为()。
A. O(n²)
B. O(e)
C. O(n+e)
D. O(e²)

答案及解析:A
采用邻接矩阵表示时,查找一个顶点所有出边的时间复杂度为O(n),共有n个顶点,故时间复杂度均为O(n²)。

2. 无向图 G = (V,E),其中 V = {a,b,c,d,e,f},E = {(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)},对该图从 a 开始进行深度优先遍历,得到的顶点序列正确的是()。
A. a,b,e,c,d,f
B. a,c,f,e,b,d
C. a,e,b,c,f,d
D. a,e,d,f,c,b

答案及解析:D
根据题意绘制草图 🏷️Img_Lec1501,如下所示。选项A,遍历到e之后,未访问的邻接结点为{d},并不包含c,因此访问顺序错误;选项B,遍历f后,未访问的邻接结点为{d},并不包含e,因此访问顺序也是错误的;选项C,访问到结点b后,不存在邻接结点应进行回退,退到结点e时,存在未访问的邻接结点d,因此,下一个访问的结点应该为d;选项D,访问到结点c时,不存在邻接结点,依次回退到结点e时,存在未访问的邻接结点b,继续访问b,完成深度优先遍历,该选项正确。


3. 如下图所示,在下面的5个序列中,符合深度优先遍历的序列个数是()。

  1. aebfdc 2. acfdeb 3. aedfcb 4. aefdbc 5. aecfdb
    🏷️Img_Lec1502

    A. 5
    B. 4
    C. 3
    D. 2

答案及解析:D
仅1和4正确。在2中,访问ac之后,c的邻接结点为,则需要回退到a,此时a的邻接结点为{b,e},因此ac之后应该访问的是b或者e,显然2访问f是错误的。在3中,访问aedf之后,f的未访问的邻接结点为空,因此需要回退到结点e,然后访问e的邻接结点b,但给出的序列是访问c,因此错误。在5中,访问ae之后,还可以继续访问e的邻接结点包括{b,d,f},但给出的序列是c,显然违背,因此也是错误的。选项1和4的遍历过程,请自行推导。

4. 一个有向图G的邻接表存储如下图所示,从顶点1出发,对图G调用深度优先遍历所得顶点序列是()。 🏷️Img_Lec1503

A. 125436
B. 124536
C. 124563
D. 362514

答案及解析:A
从顶点1出发,DFS序列产生的路径为 <1,2>,<2,5>,<5,4>,< 3, 6 >,因此产生的序列为125436,选项A正确。

5. 【2015统考真题】设有向图 G = (V,E),顶点集 V = {V0,V1,V2,V3},边集 E = {<V0,v1>,<V0,V2>,<V0,V3>,<V1,V3>}。若从顶点V0开始对图进行深度优先遍历,则可能得到的不同遍历序列个数是()。
A. 2
B. 3
C. 4
D. 5

答案及解析:D
根据题意可以得到如下有向图:🏷️Img_Lec1506

如图所示,采用图的深度优先遍历,共有5种可能:<V0,V1,V3,V2>,<V0,V2,V3,V1>,<V0,V2,V1,V3>,<V0,V3,V2,V1>,<V0,V3,V1,v2>, 选 D。

6.【2016统考真题】下列选项中,不是下图深度优先搜索序列的是()。
🏷️Img_Lec1507

A. V1,V5,V4,V3,V2
B. V1,V3,V2,V5,V4
C. V1,V2,V5,V4,V3
D. V1,V2,V3,V4,V5

答案及解析:D
对于本题,只需按深度优先遍历的策略进行遍历。对于选项A、B、C,只需要顺着箭头方向进行遍历均可完成深度优先搜索。选项D,访问V1V2后,V2的邻接结点为V5,但给出的序列却是V3,显然错误。

【课堂互动15.2】广度优先搜索

1. 对有n个顶点、e条边且使用邻接表存储的有向图进行广度优先遍历,其算法的时间复杂度是()。
A. O(n)
B. O(e)
C. O(n+e)
D. O(ne)

答案及解析:C
广度优先遍历需要借助队列实现。采用邻接表存储方式对图进行广度优先遍历时,每个顶点均需入队一次(顶点表遍历),故时间复杂度为O(n), 在搜索所有顶点的邻接点的过程中,每条边至少访问一次(出边表遍历),所以时间复杂度为O(e),算法总的时间复杂度为O(n+e)。

2.【2013统考真题】若对如下无向图进行遍历,则下列选项中,不是广度优先遍历序列的是()。🏷️Img_Lec1505

A. h, c, a, b, d, e, g, f
B. e, a, f, g, b, h, c, d
C. d, b, c, a, h, e, f, g
D. a, b, c, d, h, e, f, g

答案及解析:D
根据DFS和BFS的遍历过程可知,选项ABC都属于广度优先遍历,选项D属于深度优先遍历。

3. 图的广度优先生成树的树高比深度优先生成树的树高()。
A. 小或相等
B. 小
C. 大或相等
D. 大

答案及解析:A
对于无向图的广度优先搜索生成树,起点到其他顶点的路径是图中对应的最短路径,即所有生成树中树高最小。此外,深度优先总是尽可能“深”地搜索图,因此其路径也尽可能长,故深度优先生成树的树高总是大于或等于广度优先生成树的树高。

4 . 一个有向图G的邻接表存储如下图所示,从顶点1出发,对图G调用按广度优先遍历所得顶点序列是()。 🏷️Img_Lec1503

A. 125436
B. 124536
C. 124563
D. 362514

答案及解析:B
从顶点1出发,BFS序列产生的路径为<1,2>,<1,4>,<2,5>,< 3, 6 >,因此产生的序列为124536,选项B正确。

【扩展练习15】

1. 下列关于广度优先算法的说法中,正确的是()。
Ⅰ. 当各边的权值相等时,广度优先算法可以解决单源最短路径问题
Ⅱ. 当各边的权值不等时,广度优先算法可用来解决单源最短路径问题
Ⅲ. 广度优先遍历算法类似于树中的后序遍历算法
Ⅳ. 实现图的广度优先算法时,使用的数据结构是队列
A. Ⅰ、Ⅳ
B. Ⅱ、Ⅲ、Ⅳ
C. Ⅱ、Ⅳ
D. Ⅰ、Ⅲ、Ⅳ

答案及解析:A
广度优先搜索以起始结点为中心,一层一层地向外层扩展遍历图的顶点,因此无法考虑到边权值,只适合求边权值相等的图的单源最短路径。广度优先搜索相当于树的层序遍历,选项Ⅲ错误。与层次遍历类似,广度优先搜索也需要使用队列;而深度优先搜索存在一个回退操作,刚好与栈的性质一致,选项Ⅳ正确。

2. 判断有向图中是否存在回路,除可以利用拓扑排序外,还可以利用()。
A. 求关键路径的方法
B. 求最短路径的 Diikstra算法
C. 深度优先遍历算法
D. 广度优先遍历算法

答案及解析:C
判断有向图中是否存在回路,除了可以利用拓扑排序外,还可以利用深度优先遍历算法(DFS)。深度优先遍历算法在遍历的过程中会保留上一个访问的顶点信息,如果在遍历过程中发现当前顶点已经被访问过,那么就说明存在回路。因此,选项C是正确的。求关键路径的方法和求最短路径的Dijkstra算法与判断回路无关;广度优先遍历算法虽然可以用于判断回路,但不是本题的最佳答案。

3. 设无向图 G = (V, E) 和 G'= (V', E'),若G'是G的生成树,则下列说法中错误的是()。
A. G'为G 的子图
B. G'为G的连通分量
C. G'为G的极小连通子图且 V = V'
D. G'是G 的一个无环子图

答案及解析:B
连通分量是无向图的极大连通子图,其中极大的含义是将依附于连通分量中顶点的所有边都加上,所以连通分量中可能存在回路,这样就不是生成树了。
注意: 极大连通子图是无向图(不一定连通)的连通分量,极小连通子图是连通无向图的生成树。极小和极大是在满足连通的前提下,针对边的数目而言的。极大连通子图包含连通分量的全部边;极小连通子图(生成树)包含连通图的全部顶点,且使其连通的边数最少。

4. 无向图 G = (V, E), 其中 V = {a,b,c,d,e,f}, E = {(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)} 。对该图进行深度优先遍历,不能得到的序列是()。
A. acfdeb
B. aebdfc
C. aedfcb
D. abecdf

答案及解析:D
根据题意绘制无向图G,然后按图进行深度优先遍历🏷️Img_Lec1504

从上图不难得到,除选项D有误,其他选项均可以遵循深度优先遍历的规则得到。选项D,在遍历abe后,应继续访问结点d,但该选项直接跳到结点c,显然不正确。

5. 用邻接表存储的图的广度优先遍历算法类似于树的()。
A. 中序遍历
B. 先序遍历
C. 后序遍历
D. 按层次遍历

答案及解析:D
图的广度优先遍历算法BFS会首先访问起始结点,然后依次访问所有未被访问过的邻接节点,这个过程就像树的按层次遍历一样,按照树的层次从上到下、从左到右进行遍历。因此,用邻接表存储的图的广度优先遍历算法类似于树的按层次遍历。

6. 对一个有n个顶点、e条边的图采用邻接表表示时,进行BFS遍历的时间复杂度为和空间复杂度分别为:()。
A. O(n+e) O(n)
B. O(n+e) O(e)
C. O(n) O(n)
D. O(n) O(e)

答案及解析:A
深度优先遍历时,每个顶点表结点和每个边表结点均查找一次,每个顶点递归调用一次,需要借助一个递归工作栈;而广度优先遍历时,也是每个顶点表结点和每个边表结点均查找一次,每个顶点进入队列一次。因此,两种遍历方法的时间复杂度都是O(n+e),空间复杂度都是O(n)。

第15讲 图的遍历 课堂互动 隐藏答案 | 返回首页