第7章自测题与答案.docx

上传人:b****5 文档编号:30740188 上传时间:2023-08-20 格式:DOCX 页数:27 大小:90.13KB
下载 相关 举报
第7章自测题与答案.docx_第1页
第1页 / 共27页
第7章自测题与答案.docx_第2页
第2页 / 共27页
第7章自测题与答案.docx_第3页
第3页 / 共27页
第7章自测题与答案.docx_第4页
第4页 / 共27页
第7章自测题与答案.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

第7章自测题与答案.docx

《第7章自测题与答案.docx》由会员分享,可在线阅读,更多相关《第7章自测题与答案.docx(27页珍藏版)》请在冰豆网上搜索。

第7章自测题与答案.docx

第7章自测题与答案

第7章图自测卷解答姓名班级

题号一二三四五总分

题分1620241030100

得分

一、单选题(每题1分,共16分)

(C)1.在一个图中,所有顶点的度数之和等于图的边数的倍。

A.1/2B.1C.2D.4

(B)2.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的倍。

A.1/2B.1C.2D.4

(B)3.有8个结点的无向图最多有条边。

A.14B.28C.56D.112

(C)4.有8个结点的无向连通图最少有条边。

A.5B.6C.7D.8

(C)5.有8个结点的有向完全图有条边。

A.14B.28C.56D.112

(B)6.用邻接表表示图进行广度优先遍历时,通常是采用来实现算法的。

A.栈B.队列C.树D.图

(A)7.用邻接表表示图进行深度优先遍历时,通常是采用来实现算法的。

A.栈B.队列C.树D.图

(C)8.已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是

0111101

1001001

A.0243156

1000100B.0136542

C.04231651100110

1011010

D.0361542

0001101

建议:

0134256

1100010

(D)9.已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按深度优先遍历的结点序列是

A.0243156B.0135642C.0423165D.0134256

(B)10.已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按广度优先遍历的结点序列是

A.0243651B.0136425C.0423156D.0134256

(建议:

0123456)

(C)11.已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按广度优先遍历的结点序列是

A.0243165B.0135642C.0123465D.0123456

1

(D)12.已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是

A.0132B.0231

C.0321D.0123

(A)13.已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是

A.0321B.0123

C.0132D.0312

(A)14.深度优先遍历类似于二叉树的

A.先序遍历B.中序遍历C.后序遍历D.层次遍历

(D)15.广度优先遍历类似于二叉树的

A.先序遍历B.中序遍历C.后序遍历D.层次遍历

(A)16.任何一个无向连通图的最小生成树

A.只有一棵B.一棵或多棵C.一定有多棵D.可能不存在

(注,生成树不唯一,但最小生成树唯一,即边权之和或树权最小的情况唯一)

二、填空题(每空1分,共20分)

1.图有邻接矩阵、邻接表等存储结构,遍历图有深度优先遍历、广度优先遍历等方法。

2.有向图G用邻接表矩阵存储,其第i行的所有元素之和等于顶点i的出度。

3.如果n个顶点的图是一个环,则它有n棵生成树。

(以任意一顶点为起点,得到n-1条边)

4.n个顶点e条边的图,若采用邻接矩阵存储,则空间复杂度为O(n

2)。

5.n个顶点e条边的图,若采用邻接表存储,则空间复杂度为O(n+e)。

6.设有一稀疏图G,则G采用邻接表存储较省空间。

7.设有一稠密图G,则G采用邻接矩阵存储较省空间。

8.图的逆邻接表存储结构只适用于有向图。

9.已知一个图的邻接矩阵表示,删除所有从第i个顶点出发的方法是将邻接矩阵的第i行全部置0。

10.图的深度优先遍历序列不是惟一的。

2

11.

n个顶点e条边的图采用邻接矩阵存储,深度优先遍历算法的时间复杂度为O(n

2

);若采用邻接

表存储时,该算法的时间复杂度为O(n+e)。

12.n个顶点e条边的图采用邻接矩阵存储,广度优先遍历算法的时间复杂度为O(n

2);若采用邻接

表存储,该算法的时间复杂度为O(n+e)。

13.图的BFS生成树的树高比DFS生成树的树高小或相等。

14.用普里姆(Prim)算法求具有n个顶点e条边的图的最小生成树的时间复杂度为O(n

2);用克鲁

斯卡尔(Kruskal)算法的时间复杂度是O(elog2e)。

15.若要求一个稀疏图G的最小生成树,最好用克鲁斯卡尔(Kruskal)算法来求解。

16.若要求一个稠密图G的最小生成树,最好用普里姆(Prim)算法来求解。

17.用Dijkstra算法求某一顶点到其余各顶点间的最短路径是按路径长度递增的次序来得到最短路

径的。

18.拓扑排序算法是通过重复选择具有0个前驱顶点的过程来完成的。

三、简答题(每题6分,共24分)

1.已知如图所示的有向图,请给出该图的:

(1)每个顶点的入/出度;

顶点123456

(2)邻接矩阵;

入度(3)邻接表;

出度

(4)逆邻接表。

答案:

3

19.

请对下图的无向带权图:

(1)写出它的邻接矩阵,并按普里姆算法求其最小生成树;

(2)写出它的邻接表,并按克鲁斯卡尔算法求其最小生成树。

解:

设起点为a。

可以直接由原始图画出最小生成树,而且最小生

成树只有一种(类)!

邻接矩阵为:

043

4

3

0

5

5

0

5

5

9

5

最小生成树→

5507654

9703

6302

5206

5460

PRIM算法(横向变化):

VbcdefghUV-U

Vexaaaaaaa{a}{b,c,d,e,f,g,h}

lowcost43

∞∞∞∞∞

Vexa0caaac{a,c}{b,d,e,f,g,h}

lowcost455

∞∞∞

Vex00cbaac{a,c,b}{d,e,f,g,h}

lowcost595

∞∞

Vex000dddd{a,c,b,d}{e,f,g,h}

lowcost7654

Vex000ddd0{a,c,b,d,h{e,f,g}

lowcost765}

Vex000dg00{a,c,b,d,h,{f,e}

lowcost72g}

Vex000f000{a,c,b,d,h,{e}

lowcost3g,f}

Vex0000000{a,c,b,d,h,{}

lowcostg,f,e}

邻接表为:

a→b4→c3

b→a4→c5→d5→e9^

c→a3→b5→d5→h5^

d→b5→c5→e7→f6→g5→h4^

e→b9→d7→f3^

f→d6→e3→g2^

4

g→d5→f2→h6^

h→c5→d4→g6^

克鲁斯卡尔算法步骤

(按边归并,堆排序):

先罗列:

f---2---ga—3--cf—3—ea—4---bd—4—h

(a,b,c)(e,f,g)(d,h)取b—5—d,g—5--d就把三个连通分量连接起来了。

20.已知二维数组表示的图的邻接矩阵如下图所示。

试分别画出自顶点1出发进行遍历所得的深度优先生成

树和广度优先生成树。

21.试利用Dijkstra算法求图中从顶点a到其他各顶点间的最短路径,

写出执行算法过程中各步的状态。

解:

最短路径为:

(a,c,f,e,d,g,b)

5

四、给定下列网G:

(10分)

1试着找出网G的最小生成树,画出其逻辑结构图;

2用两种不同的表示法画出网G的存储结构图;

3用C语言(或其他算法语言)定义其中一种表示法(存储结构)的数据类型。

解:

1.最小生成树可直接画出,如右图所示。

AB———————C

22.可用邻接矩阵和邻接表来描述:

12

12

20

4

8

9

E————FG————D

201512

描述存储结构的数据类型可参见教材或电子教案:

注:

用两个数组分别存储顶点表和邻接矩阵1510

486

#defineINFINITYINT_MAX//最大值∞

#defineMAX_VERTEX_NUM20//假设的最大顶点数(可取为7)

Typedefenum{DG,DN,AG,AN}GraphKind;//有向/无向图,有向/无向网96

1210

TypedefstructArcCell{//弧(边)结点的定义

VRTypeadj;//顶点间关系,无权图取1或0;有权图取权值类型

InfoType*info;//该弧相关信息的指针

}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

Typedefstruct{//图的定义

VertexTypevexs[MAX_VERTEX_NUM];//顶点表,用一维向量即可

AdjMatrixarcs;//邻接矩阵

IntVernum,arcnum;//79顶点总数(),弧(边)总数()

GraphKindkind;//图的种类标志邻接表为:

}Mgraph;

a→b12→e4^

b→a12→c20→e8→f9^

c→b20→d15→g12^

d→c15→g10^

e→a4→b8→f6^

f→b9→e6^

g→c12→d10

五、算法设计题(每题10分,共30分)

2.编写算法,由依次输入的顶点数目、弧的数目、各顶点的信息和各条弧的信息建立有向图的邻接表。

解:

StatusBuild_AdjList(ALGraph&G)//输入有向图的顶点数,边数,顶点信息和边的信息建立邻接表

{

InitALGraph(G);

scanf("%d",&v);

if(v<0)returnERROR;//顶点数不能为负

G.vexnum=v;

6

scanf("%d",&a);

if(a<0)returnERROR;//边数不能为负

G.arcnum=a;

for(m=0;m

G.vertices[m].data=getchar();//输入各顶点的符号

for(m=1;m<=a;m++)

{

t=getchar();h=getchar();//t为弧尾,h为弧头

if((i=LocateVex(G,t))<0)returnERROR;

if((j=LocateVex(G,h))<0)returnERROR;//顶点未找到

p=(ArcNode*)malloc(sizeof(ArcNode));

if(!

G.vertices.[i].firstarc)G.vertices[i].firstarc=p;

else

{

for(q=G.vertices[i].firstarc;q->nextarc;q=q->nextarc);

q->nextarc=p;

}

p->adjvex=j;p->nextarc=NULL;

}//while

returnOK;

}//Build_AdjList

23.试在邻接矩阵存储结构上实现图的基本操作:

DeleteArc(G,v,w),即删除一条边的操作。

(如果要删除所

有从第i个顶点出发的边呢?

提示:

将邻接矩阵的第i行全部置0)

解:

//本题中的图G均为有向无权图。

StatusDelete_Arc(MGraph&G,charv,charw)//在邻接矩阵表示的图G上删除边(v,w)

{

if((i=LocateVex(G,v))<0)returnERROR;

if((j=LocateVex(G,w))<0)returnERROR;

if(G.arcs[i][j].adj)

{

G.arcs[i][j].adj=0;

G.arcnum--;

}

returnOK;

}//Delete_Arc

24.试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj

的路径(i≠j)。

注意:

算法中涉及的图的基本操作必须在此存储结构上实现。

intvisited[MAXSIZE];//指示顶点是否在当前路径上

intexist_path_DFS(ALGraphG,inti,intj)//深度优先判断有向图G中顶点i到顶点j

是否有路径,是则返回1,否则返回0

{

if(i==j)return1;//i就是j

7

else

{

visited[i]=1;

for(p=G.vertices[i].firstarc;p;p=p->nextarc)

{

k=p->adjvex;

if(!

visited[k]&&exist_path(k,j))return1;//i下游的顶点到j有路径

}//for

}//else

}//exist_path_DFS

解2:

(以上算法似乎有问题:

如果不存在路径,则原程序不能返回0。

我的解决方式是在原程序的中引入

一变量level来控制递归进行的层数。

具体的方法我在程序中用红色标记出来了。

intvisited[MAXSIZE];//指示顶点是否在当前路径上

intlevel=1;//递归进行的层数

intexist_path_DFS(ALGraphG,inti,intj)//深度优先判断有向图G中顶点i到顶点j

是否有路径,是则返回1,否则返回0

{

if(i==j)return1;//i就是j

else

{

visited[i]=1;

for(p=G.vertices[i].firstarc;p;p=p->nextarc,level--)

{level++;

k=p->adjvex;

if(!

visited[k]&&exist_path(k,j))return1;//i下游的顶点到j有路径

}//for

}//else

if(level==1)return0;

}//exist_path_DFS

附加题:

采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的

简单路径的算法。

(注1:

一条路径为简单路径指的是其顶点序列中不含有重现的顶点。

注2:

此题可参见严题集P207-208中有关按“路径”遍历的算法基本框架。

intvisited[MAXSIZE];

intexist_path_len(ALGraphG,inti,intj,intk)//判断邻接表方式存储的有向图G

的顶点i到j是否存在长度为k的简单路径

{

{

if(i==j&&k==0)return1;//找到了一条路径,且长度符合要求

elseif(k>0)

{

visited[i]=1;

for(p=G.vertices[i].firstarc;p;p=p->nextarc)

8

{

l=p->adjvex;

if(!

visited[l])

if(exist_path_len(G,l,j,k-1))return1;//剩余路径长度减一

}//for

visited[i]=0;//本题允许曾经被访问过的结点出现在另一条路径中

}//else

return0;//没找到

}//exist_path_len

9

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1