当前位置:
文档之家› 北邮数据结构第六章答案详解 图(1)
北邮数据结构第六章答案详解 图(1)
1
5
1
54 3
42
5 66
图 6-8 图 G 答案:根据不同算法构造的最小生成树如图 6-9 所示的图(a)和(b)
2
④
⑤ 5
1
①
4 3
②
③
6
2
⑤
③ 5
1
①
4 3
④
②
6
(a) Prim 生成树
(b) Kruskal 生成树
图 6-9 最小生成树
5、算法设计
(1)以邻接表为存储结构,设计实现深度优先遍历的非递归算法。
int top = -1; cout<<v<<’\t’; bVisited[v] = true; stack[++top] = v;
//访问结点 v //设置访问标记 //结点 v 入栈
while (top!=-1)
{
v=stack[top];
ArcNode<T> *p = adjlist[v]. firstarc; ①
)
A.1
B. n/2
C.n-1
D.n
解析:若超过 n-1,则路径中必存在重复的顶点
答案:C
(5) 若一个图中包含有 k 个连通分量,若按照深度优先搜索的方法访问所有顶点,则必
须调用(
)次深度优先搜索遍历的算法。
A.k
B.1
C.k-1
D.k+1
解析:一次深度优先搜索可以访问一个连通分量中的所有结点,因此 k 个连通分量需要 调用 k 次深度优先遍历算法。
④
} if (p==NULL) top--;
⑤//若是找不到未访问的结点,出栈
}
}
注:上述代码中标记①~⑤的黑体代码部分为基于邻接矩阵和基于邻接表两种不同的存
储结构实现非递归深度遍历算法的不同之处,请自行对比 6.2.1 小节的代码学习邻接矩阵和
邻接表在处理结点时的区别。
解析:连通分量的定义是极大连通子图,即该子图包含所有的顶点和与这些顶点相连的 所有的边。生成树的定义是极小连通子图,是子图的一种,并且本书所有的图均是无环图,
因此 A、C、D 是正确的。
答案:B
3、画出图 6-7 所示的无向图 G 的邻接表(顶点按照 ASCII 排列),并根据所得邻接表 给出从 A 点开始的深度优先和广度优先搜索遍历该图所的顶点序列。
B
C
D
A
G
E
H
F
答案:邻接表如下图所示:
图 6-7 无向图 G
0A
1
7
1B
0
2
6
7
2C
1
3
6
3D
2
4
6
4E
3
5
6
5F
4
6
7
6G
1
2
3
4
5
7
7H
0
1
5
6
深度优先:ABCDEFGH 广度优先:ABHCGFDE
4、分别使用普里姆算法和克鲁斯卡尔算法构造出如图 6-8 所示图 G 的一棵最小生成树
6 25 36
)。
A.先序遍历
B.中序遍历
C.后序遍历
D.按层遍历。
答案:D
(10) 设有一个无向图 G=(V,E)和 G'=(V',E')如果 G'为 G 的生成树,则下面不正确的说法
是(
)
A.G'为 G 的子图
B.G'为 G 的连通分量
C.G'为 G 的极小连通子图且 V'=V D.G'为 G 的一个无环子图
答案:C
(2) 在一个具有 n 个顶点的有向图中,若所有顶点的出度数之和为 S,则所有顶点的度
数之和为(
)。
A.S
B.S-1
C.S+1
D.2S
答案:A
(3) 具有 n 个顶点的有向图最多有(
)条边。
A.n
B.n(n—1)
C.n(n+1)
D.n2
答案:B
(4) 含 n 个顶点的连通图中任意一条简单路径,其长度不可能超过(
vertex firstarc 顶点结点
};
struct ArcNode{ int adjvex;
//弧结点 //数据域:邻接顶点下标
adjvex nextarc
ArcNode * next;
//指针域:指向下一条弧结点
弧结点
};
const int MAXSIZE =10;
template <class T> class ALGraph //邻接表类
(10) 一棵具有 n 个顶点的生成树有且仅有(______)条边。 答案:n-1
2、 单选题
(1) 在一个无向图中,所有顶点的度数之和等于所有边数的(
)倍
A.1/2
B.1
C.2
D.4
解析:顶点的度指的是与该顶点相连的边数,每一条边和两个顶点相连,因此该条边被 相邻的两个顶点各计算 1 次,因此图的总度数是边数的两倍。
解析:根据图的边集信息可得如图 6-6 所示的无向图,从 A 点开始广度遍历则为 A、B、 C、D、E、F。
B A
D E
C
F
图 6-6 构造无向图
答案:A
(8) 存储无向图的邻接矩阵是(
),存储有向图的邻接矩阵是(
)。
A.对称的
B.非对称的
答案:A B
(9) 采用邻接表存储的图的广度优先遍历算法类似于二叉树的(
{
private:
VertexNode adjlist[MAXSIZE]; //结点
和弧的数目
……
};
程序代码实现:
template <class T>
void AGraph<T>::DFS(int v)
{ int stack[MAXSIZE];
//定义顺序栈
while(p!=NULL)
②
{
int i = p-> adjvex;
③
if(!bVisited[i]) //查找未访问过的邻接点
{
cout<< i <<’\t’; bVisited[i] = true;
//访问结点 i //设置访问标记
stack[++top] = i;
//i 入栈
break;
}
p = p->next;
1
4
2
5
3
图 6-5 构造有向图
答案:A
(7) 若一个图的边集为{(A,B),(A,C),(B,D),(C,F),(D,E),(D,F)},则从顶点 A 开始对该图进
行广度优先遍历,得到的顶点序列可能是(
)。
A. A,B,C,D,E,F B. A,B,C,F,D,E C. A,B,D,C,E,F D. A,B,C, D,F, E
第六章 图
1、填空题
(1) n 个顶点的无向图,最多能有(__________)条边。 解析:完全图是边数最多的图,参考完全图的定义即可。 答案:n*(n-1)/2 (2) 有 n 个顶点的连通无向图 G 至少有(________)条边。 解析:生成树是连通图中边数最少的图,参考生成树的定义即可。 答案:n-1 (3) 有 n 个顶点的强连通有向图 G 至少有(________)条弧。 答案:n (4) G 为无向图,如果从 G 的某个顶点出发,进行一次广度优先遍历,即可访问图的每 个顶点,则该图一定是(_______)图。 解析:若一次遍历能访问所有的结点,说明各个结点之间都可达。 答案:连通 (5) 若采用邻接矩阵结构存储具有 n 个顶点的图,则对该图进行广度优先遍历的算法时 间复杂度为______。 解析:广度优先遍历需要遍历 n 个结点,对于每一个结点需要遍历邻接矩阵的一行以找 出该结点的所有连接点,即循环 n 次,因此,总的时间复杂度是 O(n2)。 答案:O(n2) (6) n 个顶点的连通图的生成树有(______)条边。 答案:n-1 (7) 图的深度优先遍历类似于树的(______)遍历;图的广度优先遍历类似于树的(______) 遍历。 答案:前序 层序 (8) 对于含有 n 个顶点 e 条边的连通图,得用 Prim 算法求最小生成树的时间复杂度为 (______)。 答案:O(n2) (9) 已知无向图 G 的顶点数为 n,边数为 e,其邻接表表示的空间复杂度为(______)。 答案:O(n+e)
答案:A
(6) 若一个图的边集为{<1,2>,<1,4>,<2,5>,<3,1>,<3,5>,<4,3>},则从顶点 1 开始对该图进
行深度优先遍历,得到的顶点序列可能为(
)。
A.1,2,5,4,3
B.1,2,3,4,5
C.1,2,5,3,4
D.1,4,3,2,5。
解析:根据图的边集信息可得如图 6-5 所示的有向图,因此从 1 点开始遍历的顺序可以 为 1、2、5、4、3。
答案:参考 5.2.1 小节基于邻接矩阵实现深度优先遍历的非递归算法,修改查找未访问
过的邻接点的方法即可。实现该算法的邻接表的存储结构如下,包括顶点结点、弧结点和邻
接表类结构:
struct VertexNode{ char Vertex;
ArcNode *firstarc;
//顶点结点 //数据域:顶点信息 //指针域:指向第一条弧