第7章自测题与答案.docx
- 文档编号:5176790
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:11
- 大小:447.75KB
第7章自测题与答案.docx
《第7章自测题与答案.docx》由会员分享,可在线阅读,更多相关《第7章自测题与答案.docx(11页珍藏版)》请在冰豆网上搜索。
第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
D)12.已知图的邻接表如下所示,根据算法,则从顶点
A)13.已知图的邻接表如下所示,根据算法,则从顶点
0出发按深度优先遍历的结点序列是
A.0132B.0231
C.0321D.0123
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)。
5.n个顶点e条边的图,若采用邻接表存储,则空间复杂度为O(n+e)。
6.设有一稀疏图G,则G采用邻接表存储较省空间。
7.设有一稠密图G,则G采用邻接矩阵存储较省空间。
8.图的逆邻接表存储结构只适用于有向图。
9.已知一个图的邻接矩阵表示,删除所有从第i个顶点出发的方法是将邻接矩阵的第i行全部置0
10.图的深度优先遍历序列不是惟一的。
11.n个顶点e条边的图采用邻接矩阵存储,深度优先遍历算法的时间复杂度为O(n2);若采用邻接
表存储时,该算法的时间复杂度为O(n+e)。
12.n个顶点e条边的图采用邻接矩阵存储,广度优先遍历算法的时间复杂度为O(n);若采用邻接
表存储,该算法的时间复杂度为O(n+e)。
13.图的BFS生成树的树高比DFS生成树的树高小或相等。
14.用普里姆(Prim)算法求具有n个顶点e条边的图的最小生成树的时间复杂度为O(n);用克鲁斯卡尔(Kruskal)算法的时间复杂度是O(elog2e)。
15.若要求一个稀疏图G的最小生成树,最好用克鲁斯卡尔(Kruskal)算法来求解。
16.若要求一个稠密图G的最小生成树,最好用普里姆(Prim)算法来求解。
17.用Dijkstra算法求某一顶点到其余各顶点间的最短路径是按路径长度递增的次序来得到最短路径的。
18.拓扑排序算法是通过重复选择具有0个前驱顶点的过程来完成的
三、简答题(每题6分,共24分)
1.已知如图所示的有向图,请给出该图的
(1)每个顶点的入/出度;顶点123456
(2)邻接矩阵;入度(3)邻接表;
19.请对下图的无向带权图:
(1)写出它的邻接矩阵,并按普里姆算法求其最小生成树;
(2)写出它的邻接表,并按克鲁斯卡尔算法求其最小生成树。
解:
设起点为a。
可以直接由原始图画出最小生成树,而且最小生成树只有一种(类)!
邻接矩阵为:
043
4
055
9
3
505
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,dlowcost765}
Vex000dg00{a,c,b,dlowcost72g}
h{e,f,g}
h,{f,e}
Vex000f000{a,clowcost3g,f}Vex0000000{a,c,b,d,h,lowcostg,f邻接表为:
e}
a→b4→c3
b,d,
h,{e}
a4→c5→d5→e9^
a3→b5→d5→h5^
b5→c5→e7→f6
g5→h4^
e→b9→d7→f3^f→d6→e3→g2^
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)
四、给定下列网G:
(10分)
1试着找出网G的最小生成树,
2用两种不同的表示法画出网
画出其逻辑结构图;
G的存储结构图;
3用C语言(或其他算法语言)定义其中一种表示法(存储结构)的数据类型。
解:
1.最小生成树可直接画出,如右图所示。
22.可用邻接矩阵和邻接表来描述:
12
2.编写算法,由依次输入的顶点数目、弧的数目、各顶点的信息和各条弧的信息建立有向图的邻接表。
解:
StatusBuild_AdjList(ALGraph&G)//输入有向图的顶点数,边数,顶点信息和边的信息建立邻接表
{
InitALGraph(G);
scanf("%d",&v);
if(v<0)returnERROR;//顶点数不能为负
G.vexnum=v;
scanf("%d",&a);
if(a<0)returnERROR;//边数不能为负G.arcnum=a;
for(m=0;m 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.试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点的路径(i≠j)。 注意: 算法中涉及的图的基本操作必须在此存储结构上实现。 intvisited[MAXSIZE];//指示顶点是否在当前路径上intexist_path_DFS(ALGraphG,inti,intj)//深度优先判断有向图G中顶点i到顶点j是否有路径,是则返回1,否则返回0 { 如果要删除所 vi到顶点vj if(i==j)return1;//i就是j 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 }//elseif(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) {l=p->adjvex;if(! visited[l])if(exist_path_len(G,l,j,k-1))return1;//剩余路径长度减一}//forvisited[i]=0;//本题允许曾经被访问过的结点出现在另一条路径中}//elsereturn0;//没找到
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自测 答案
![提示](https://static.bdocx.com/images/bang_tan.gif)