第6章 图习题参考答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

习题六参考答案
一、选择题
1.在一个有个顶点的有向图中,若所有顶点的出度之和为,则所有顶点的入度之和为(A)。

A. B. C. D.
2.一个有向图有个顶点,则每个顶点的度可能的最大值是(B)。

A. B. C. D.
3.具有6个顶点的无向图至少应有(A)条边才能确保是一个连通图。

A.5
B.6
C.7
D.8
4.一个有n个顶点的无向图最多有(C)条边。

A. B. C. D.
5.对某个无向图的邻接矩阵来说,下列叙述正确的是(A)。

A.第行上的非零元素个数和第列上的非零元素个数一定相等
B.矩阵中的非零元素个数等于图中的边数
C.第行与第列上的非零元素的总数等于顶点的度数
D.矩阵中非全零行的行数等于图中的顶点数
6.已知一个有向图的邻接矩阵,要删除所有以第个顶点为孤尾的边,应该(B)。

A.将邻接矩阵的第行删除
B.将邻接矩阵的第行元素全部置为0
C.将邻接矩阵的第列删除
D.将邻接矩阵的第列元素全部置为0
7.下面关于图的存储的叙述中,哪一个是正确的?……(A)
A.用邻接矩阵存储图,占用的存储空间只与图中顶点数有关,而与边数无关
B.用邻接矩阵存储图,占用的存储空间只与图中边数有关,而与顶点数无关
C.用邻接表存储图,占用的存储空间只与图中顶点数有关,而与边数无关
D.用邻接表存储图,占用的存储空间只与图中边数有关,而与顶点数无关
8.对图的深度优先遍历,类似于对树的哪种遍历?……(A)
A.先根遍历
B.中根遍历C.后根遍历D.层次遍历
9.任何一个无向连通图的最小生成树(B)。

A.只有一棵
B.有一棵或多棵
C.一定有多棵
D.可能不存在
10.下面是三个关于有向图运算的叙述:
(1)求两个指向结点间的最短路径,其结果必定是唯一的
(2)求有向图结点的拓扑序列,其结果必定是唯一的
(3)求AOE网的关键路径,其结果必定是唯一的
其中哪个(些)是正确的?……(D )
A.只有(1)
B.(1)和(2)
C.都正确
D.都不正确
二、填空题
1.若用表示图中顶点数,则有条边的无向图称为完全图。

2.若一个无向图有100条边,则其顶点总数最少为15个。

3.个顶点的连通无向图至少有条边,至多有条边。

4.若有向图的邻接矩阵为:
则顶点的入度是3。

5.对于一个有向图,若一个顶点的度为,出度为,则对应逆邻接表中该顶点单链表中的边
结点数为。

6.图的遍历算法BFS中用到辅助队列,每个顶点最多进队1次。

7.在求最小生成树的两种算法中,克鲁斯卡尔算法适合于稀疏图。

8.数据结构中的迪杰斯特拉算法是用来求某个源点到其余各顶点的最短路径。

9.除了使用拓扑排序的方法,还有深度优先搜索方法可以判断出一个有向图是否有回路。

10.在用邻接表表示图时,拓扑排序算法的时间复杂度为。

三、应用题
1.已知如图6.28所示的有向图,请给出该图的
(1) 每个顶点的出/入度;
(2) 邻接矩阵;
1
2
3
4
5
6
图 6.28有向图
(3) 邻接表;
(4) 逆邻接表。

答:
(1) 每个顶点的出/入度是:
出度入度
1 0 3
2 2 2
3 2 1
4 3 1
5 1 2
6 3 2
(2) 邻接矩阵:
(3) 邻接表:
(4) 逆邻接表:
2.试对如图6.29所示的非连通图,画出其广度优先生成森林。

4
1
2
3
1
2
3
4
5
2 5 Λ
3 Λ
1 Λ
5 6
3
2 3 Λ
1 4 5 Λ
5 Λ
4
1
2
3
1
2
3
4
Λ
5
0 3 Λ
1
2 4
5 6
5 Λ
5 Λ
0 Λ
0 1 4 Λ
答:
3.已知图的邻接矩阵如图6.30所示。

试分别画出自顶点A出发进行遍历所得的深度优先生成树
和广度优先生成树。

答:
I
H
D
A
B
F
G
J
C E
I
H
E
D
A
B
F
G
J
C
图错误!文档中没有指定样式的文字。

.30邻接矩阵
G
I K
H
E
D
A
C F
B L
J
M
图错误!文档中没有指定样式的文字。

.29非连通图
G
I K
H
E
D
A
C
F
B
L
J
M
4.请对如图6.31所示的无向网:
(1) 写出它的邻接矩阵,并按克鲁斯卡尔算法求其最小生成树;
(2) 写出它的邻接表,并按普里姆算法求其最小生成树。

答:(1)
5
3
4
6
5
5
图错误!文档中没有指定样式的文字。

.31无向网5
4
3
7
A
B
E
F
D
C
9
G
H
5
2
6
(2) A B C D
0 1 2 3 E F G H
4 5 6 7
1 4 Λ 3
2 0 4 2 5
3 5 Λ 9
4 1
5 2 5 4 7 5 6
6 5
Λ
4 7 0 3 1
5 3 5 Λ 5 7 1 9 3 7 Λ 3 5 3
6 4 3 Λ 2 6 3 5 5 2 Λ 6
7 2 5
3 4
Λ
6 6 克鲁斯卡尔算法求其最小生成树
A
B E
F
D
C
G H 2
3
A
B E
F
D
C
G H 2
3
A
B E
F
D
C
G
H 2
3
3
4
3
A
B
E
F
D
C
G
H
2
3
4
4
3
A
B
E
F
D
C
G H
2
3
4
5
4
3
A
B
E
F
D
C
G H
2
3
4
5
4
3
A
B
E
F
D
C
9
G H
5
2
5. 试列出图
6.32中全部可能的拓扑有序序列。

答:abcdef 、abcef 、abecdf 、bacdef 、bacedf 、baecdf 、beacdf 四、算法设计题
1. 编写算法,从键盘读入有向图的顶点和弧,创建有向图的邻接表存储结构。

参考答案:
public static ALGraph createDG() { Scanner sc = new Scanner(System.in); System.out.println("请分别输入有向图的顶点数和边数:"); int vexNum = sc.nextInt(); int arcNum = sc.nextInt();
VNode[] vexs = new VNode[vexNum];
a
b
c
e
图 6.32 有向图
f
d
普里姆算法求其最小生成树,从A 开始
3
A
B E
F
D
C
G
H
4
3
A
B
E
F
D
C
G
H 5
4
3
A
B
E
F
D
C
G
H 4
5
4
3
A
B
E
F
D
C
G H
4
5
4
3
A
B
E
F
D
C
G
H 5
4
5
4
3
A
B
E
F
D
C
G H
5
2
3
4
5
4
3
A
B
E
F
D
C
G H
5
2
System.out.println("请分别输入有向图的各个顶点:");
for (int v = 0; v < vexNum; v++)
// 构造顶点向量
vexs[v] = new VNode(sc.next());
ALGraph G = new ALGraph(GraphKind.DG, vexNum, arcNum, vexs);
System.out.println("请输入各个边的起点和终点:");
for (int k = 0; k < arcNum; k++) {
int v = G.locateVex(sc.next());
int u = G.locateVex(sc.next());
G.addArc(v, u, 0);
}
return G;
}
2.无向图采用邻接表存储结构,编写算法输出图中各连通分量的顶点序列。

参考答案:
public static void CC_BFS(IGraph G) throws Exception {
boolean[] visited = new boolean[G.getV exNum()];// 访问标志数组
for (int v = 0; v < G.getVexNum(); v++)
// 访问标志数组初始化
visited[v] = false;
LinkQueue Q = new LinkQueue();// 辅助队列Q
LinkQueue P = new LinkQueue();// 辅助队列P,用于记录连通分量的顶点
int i = 0;// 用于记数连通分量的个数
for (int v = 0; v < G.getVexNum(); v++) {
P.clear();// 队列清空
if (!visited[v]) {// v尚未访问
visited[v] = true;
P.offer(G.getVex(v));
Q.offer(v);// v入队列
while (!Q.isEmpty()) {
int u = (Integer) Q.poll();// 队头元素出队列并赋值给u
for (int w = G.firstAdjVex(u); w >= 0; w = G.nextAdjVex(u,
w)) {
if (!visited[w]) {// w为u的尚未访问的邻接顶点
visited[w] = true;
P.offer(G.getVex(w));
Q.offer(w);
}
}
}
System.out.println("图的第" + ++i + "个连通分量为:");
while (!P.isEmpty())
System.out.print(P.poll().toString() + " ");
System.out.println();
}
}
}
3.编写算法判别以邻接表方式存储的无向图中是否存在由顶点u到顶点v的路径(u≠v)。

可以采用深度优先搜索遍历策略。

当顶点u和顶点v在无向图的同一连通分量中时,从顶点u 到顶点v一定有路径,可从顶点u(v)进行深度优先搜索,一定可以遍历至顶点v(u)。

否则,遍历不能成功,不存在由顶点u到顶点v的路径。

参考答案:
private boolean[] visited;// 访问标志数组
private boolean find = false;// 标示是否已找到了指定长度的路径
public void findPath(IGraph G, int u, int v) throws Exception {
visited = new boolean[G.getVexNum()];
for (int w = 0; w < G.getVexNum(); w++)
// 访问标志数组初始化
visited[w] = false;
find_DFS(G, u, v);
if (find)
System.out.println(G.getVex(u) + "和" + G.getVex(v) + "之间至少存在一条路径!");
else
System.out.println(G.getVex(u) + "和" + G.getVex(v) + "之间不存在路径!");
}
private void find_DFS(IGraph G, int u, int v) throws Exception {
if (u == v) {
find = true;
} else if (!find) {
visited[u] = true;
for (int w = G.firstAdjVex(u); w >= 0; w = G.nextAdjVex(u, w))
if (!visited[w])
find_DFS(G, w, v);// 对v的尚未访问的邻接顶点w递归调用find_DFS
}
}。

相关文档
最新文档