南工大第四章图.docx

上传人:b****6 文档编号:8530583 上传时间:2023-01-31 格式:DOCX 页数:30 大小:1.20MB
下载 相关 举报
南工大第四章图.docx_第1页
第1页 / 共30页
南工大第四章图.docx_第2页
第2页 / 共30页
南工大第四章图.docx_第3页
第3页 / 共30页
南工大第四章图.docx_第4页
第4页 / 共30页
南工大第四章图.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

南工大第四章图.docx

《南工大第四章图.docx》由会员分享,可在线阅读,更多相关《南工大第四章图.docx(30页珍藏版)》请在冰豆网上搜索。

南工大第四章图.docx

南工大第四章图

 

数据结构与算法上机作业

第四章图

一、选择题

1、在一个无向图中,所有顶点的度数之和等于所有边数的C倍。

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

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

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

3、G是一个非连通无向图,共有28条边,则该图至少有D个顶点。

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

4、有n个顶点的图的邻接矩阵使用B数组存储的。

A.一维B.n行n列C.任意行n列D.n行任意列

5、对于一个具有n个顶点和e条边的无向图,采用邻接表表示,则表头数组大小至少为〔假设下标为0的数组参与使用〕A。

A.n-1B.n+1C.nD.n+e

6、以下说法正确的选项是C。

A.有向图的邻接矩阵一定是不对称的

B.有向图的邻接矩阵一定是对称的

C.无向图的邻接矩阵一定是对称的

D.无向图的邻接矩阵可以不对称

7、深度优先遍历类似与二叉树的A:

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

8、广度优先遍历类似与二叉树的D:

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

9、以下关于开放树(FreeTree)的说法错误的选项是C:

A.具有n个结点的开放树包含n-1条边

B.开放树没有回路

C.开放树可以是非连通图

D.在开放树中任意加一条边,一定会产生回路

10、在如以下图所示的图中,从顶点a出发,按深度优先遍历,则可能得到的一种顶点的序列为。

A.a,b,e,c,d,fB.a,c,f,e,b,d

C.a,e,b,c,f,dD.a,e,d,f,c,b

11、在如上图所示的图中,从顶点a出发,按广度优先遍历,则可能得到的一种顶点的序列为。

A.a,b,e,c,d,fB.a,b,e,c,f,d

C.a,e,b,c,f,dD.a,e,d,f,c,b

12、设网(带权的图)有n个顶点和e条边,则采用邻接表存储时,求最小生成树的Prim算法的时间复杂度为C。

A.O(n)B.O(n+e)C.O(n2)D.O(n3)

13、设图有n个顶点和e条边,求解最短路径的Floyd算法的时间复杂度为O。

A.O(n)B.O(n+e)C.O(n2)D.O(n3)

14、最小生成树是指C。

A.由连通网所得到的边数最少的生成树。

B.由连通网所得到的顶点数相对较少的生成树。

C.连通网中所有生成树中权值之和为最小的生成树。

D.连通网的极小连通子图。

15、下面关于工程计划的AOE网的表达中,不正确的选项是B。

A.关键活动不按期完成就会影响整个工程的完成时间。

B.任何一个关键活动提前完成,那么整个工程将会提前完成。

C.所有关键活动都提前完成,那么整个工程将会提前完成。

D.某些关键工程假设提前完成,那么整个工程将会提前完成。

16、在AOE网中,始点和汇点的个数为C。

A.1个始点,假设干个汇点B.假设干个始点,假设干个汇点

C.假设干个始点,1个汇点C.1个始点,1个汇点

17、在以下图所示的无向图中,从顶点v1开始采用Prim算法生成最小生成树,算法过程中产生的顶点次序为B。

A.v1,v3,v4,v2,v5,v6B.v1,v3,v6,v2,v5,v4

C.v1,v2,v3,v4,v5,v6D.v1,v3,v6,v4,v2,v5

18、在上图所示的途中,采用Cruskal算法生成最小生成树,过程中产生的边的次序是C。

A.(v1,v2),(v2,v3),(v5,v6),(v1,v5)B.(v1,v3),(v2,v6),(v2,v5),(v1,v4)

C.(v1,v3),(v2,v5),(v3,v6),(v4,v5)D.(v2,v5),(v1,v3),(v5,v6),(v4,v5)

19、如以下图所示的图中,其中一个拓扑排序的结果是A。

A.v1→v2→v3→v6→v4→v5→v7→v8

B.v1→v2→v3→v4→v5→v6→v7→v8

C.v1→v6→v4→v5→v2→v3→v7→v8

D.v1→v6→v2→v3→v7→v8→v4→v5

20、在以下图所示的AOE网中,活动a9的最早开始时间为B。

A.13B.14C.15D.16

21、在上图所示的AOE网中,活动a4的最迟开始时间为D

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

22、设图有n个顶点和e条边,当用邻接表表示该图时,则求解最短路径的Dijkstra算法的时间复杂度为O。

A.O(n)B.O(n+e)C.O(e)D.O(n2)

二、填空题

1、假设无向图G中顶点数为n,则图G至多有n(n-1)/2条边;假设G为有向图,则图G至多有n(n-1)条边。

2、图的存储结构主要有两种,分别是邻接表和邻接矩阵。

3、假设G是有向图,则把邻接到顶点v的顶点数目或边数目称为顶点v的入度;把邻接于顶点v的顶点数目或边数目称为顶点v的出度。

4、已知一个图的邻接矩阵表示,计算第j个顶点的入度的方法是第j行非0元素的个数,计算第j个顶点的出度的方法是第j列非0元素的个数。

5、假设将图中的每条边都赋予一个权,则称这种带权的图为网络。

6、无论是有向图还是无向图,顶点数n、边数e和各顶点的度D(vi)之间的关系为:

7、假设路径上第一个顶点v1与最后一个顶点vm重合,则称这样的简单路径为回路或环。

8、如果图中任意一对顶点都是连通的,则称此图是连通图;非连通图的极大连通子图叫做连通分量。

9、创建一个邻接矩阵图的复杂度是O〔n*n〕;创建一个链接表图的复杂度是O(n+e)。

10、图的遍历有深度优先遍历和广度优先遍历等方法。

11、在深度优先搜索和广度优先搜索中,都采用visited[i]=0(false)的方式设置第i个顶点为new,而采用visited[i]=1〔true〕的方式标识第i个结点为old。

12、由于深度优先算法的特点,深度优先往往采用递归的方式实现。

13、由于广度优先算法的特点,在广度优先实现过程中,往往要借助于另一种数据结构

队列实现。

14、在深度优先搜索和广度优先搜索中,在搜索过程中所经过的边都称为搜索边。

15、连通而且无环路的无向图称为开放数。

16、对于含有n个顶点e条边的连通图,利用Prim算法求其最小生成树的时间复杂度为O(n*n),利用Kruscal算法求最小生成树的时间复杂度是O(e*lge)。

3、顶点表示活动的网简称为AOV;边表示活动的网简称为AOE。

17、一个含有n个顶点的无向连通图,其每条边的权重都是a(a>0),则其最小生成树的权重等于〔n-1〕*a。

18、具有n个顶点的有向图,如果采用邻接矩阵表示该图,则求某顶点到其他各顶点的最短路径的Dijkstra算法的时间复杂度是O(n*n);如果采用邻接表表示该图,则时间复杂度为O(e)。

19、在用Dijkstra算法求单源最短路径的过程中,将顶点集合V划分为两个集合S和V-S,其中S中的点为最短路径已确定的顶点集合,V-S中的点为最短路径未确定的顶点集合。

20、求每一对顶点之间的最短路径,可以用两种方法,一种是分别对每个顶点采用算法,另一种方法是。

21、假设有向图的邻接矩阵C的传递闭包为A,则A[i][j]=1表示。

22、有向图的中心点是指具有最小偏心度的顶点。

三、已知一个无向图如以下图所示,试给出该图的邻接矩阵和邻接表存储示意图〔画图,分别用矩阵和数组链表图表示〕,并编程分别实现该图的邻接矩阵表示和邻接表表示,要求编写两种表示方法的存储结构、相关基本操作,并在主函数中创建该图。

代码:

#include

usingnamespacestd;

#definemax_vexNum26//最大顶点个数

typedefstruct{

intvex_num,arc_num;//顶点数,边数

intcount;//记录当前顶点数

charvexs[max_vexNum];//顶点向量

doublearcs[max_vexNum][max_vexNum];//邻接矩阵

}Graph;

//添加一个新的顶点

charNewNode(Graph*G,charv){

G->vexs[G->count]=v;

G->count++;

returnv;

}

//寻找某个顶点的位置

intFindPosition(Graph*G,charv){

for(inti=0;icount;i++){

if(v==G->vexs[i])

returni;

}

}

voidDelete(Graph*G,charv){

//先删除点

inti,j;

inttemp_count=G->count;

i=FindPosition(G,v);

for(j=i;j

G->vexs[j]=G->vexs[j+1];

G->count--;

//删除边

//先删除行

intp=i;//记住位置

for(i=p;i

for(j=0;j

G->arcs[i][j]=G->arcs[i+1][j];

//再删除列

for(i=p;i

for(j=0;j

G->arcs[j][i]=G->arcs[j][i+1];

}

//建立v1与v2的一条边

voidSetSoucc(Graph*G,charv1,charv2){

//先找到对应的定的位置

inti,j;

inttemp_count=G->count;

i=FindPosition(G,v1);

j=FindPosition(G,v2);

if(i==temp_count||j==temp_count)//没有找到

return;

//找到后,A[i][j]=0;vexs[j][i]=0;

G->arcs[i][j]=1;

G->arcs[j][i]=1;

}

voidDelSucc(Graph*G,charv1,charv2){

inti,j;

inttemp_count=G->count;

i=FindPosition(G,v1);

j=FindPosition(G,v2);

if(i==temp_count||j==temp_count)//没有找到

return;

//找到后,A[i][j]=0;vexs[j][i]=0;

G->arcs[i][j]=0;

G->arcs[j][i]=0;

}

//判断v1y与v2是否连接

boolisEdge(Graph*G,charv1,charv2){

inti,j;

inttemp_count=G->count;

i=FindPosition(G,v1);

j=FindPosition(G,v2);

if(i==temp_count||j==temp_count)//没有找到

return-1;

if(G->arcs[i][j]==1)

returntrue;

returnfalse;

}

voidPrint(Graph*G){

inti,j;

for(i=0;icount;i++){

for(j=0;jcount;j++)

cout<arcs[i][j]<<"";

cout<

}

cout<

}

Graph*G=newGraph;//初始化

intmain(){

G->count=0;

NewNode(G,'A');

NewNode(G,'B');

NewNode(G,'C');

NewNode(G,'D');

//插入边

SetSoucc(G,'A','B');

SetSoucc(G,'A','D');

SetSoucc(G,'C','B');

Print(G);

//删除一个顶点

Delete(G,'C');

Print(G);

//删除边

DelSucc(G,'A','D');

Print(G);

if(isEdge(G,'A','B'))

cout<<"A与B右边"<

return0;

}

四、已知一个有向图如以下图所示,试给出图的邻接矩阵和邻接表存储示意图〔画图,分别用矩阵和数组链表图表示〕,并编程分别实现该图的邻接矩阵表示和邻接表表示,要求编写两种表示方法的存储结构、相关基本操作,并在主函数中创建该图。

代码:

#include

#include

#include

usingnamespacestd;

#definemax_n20

structArcNode{

charadjvex='#';

ArcNode*next=NULL;

};

typedefstructVNode{

chardata;

ArcNode*first_head;

}VNode,AdjList[max_n];

typedefstruct{

AdjListvertices;

intvexnum,arcnum;

intcount=0;

}Graph;

//新增一个顶点

charNewNode(Graph*G,charv){

G->vertices[G->count].data=v;

G->vertices[G->count].first_head=newArcNode;

G->count++;

returnv;

}

//寻找某个顶点的位置

intFindPosition(Graph*G,charv){

for(inti=0;icount;i++){

if(v==G->vertices[i].data)

returni;

}

}

//删除一个顶点

voidDelNode(Graph*G,charv){

inti=FindPosition(G,v);

//去头

ArcNode*p=G->vertices[i].first_head;

//现在vertices中删除

intj;

for(j=i;jcount-1;j++)

G->vertices[j]=G->vertices[j+1];

G->vertices[j].data='#';

G->vertices[j].first_head=NULL;

G->count--;

//删除边

ArcNode*q;

while(p!

=NULL){

q=p;

p=p->next;

q=NULL;

}

}

//设置v1到v2直接的一条边

voidSetSucc(Graph*G,charv1,charv2){

inti=FindPosition(G,v1);

ArcNode*p;

p=G->vertices[i].first_head;

while(p->next!

=NULL){

p=p->next;

}

ArcNode*q=newArcNode;

q->adjvex=v2;

p->next=q;

}

ArcNode*FindNode(ArcNode*p,charv2){

for(;p;p=p->next){

if(p->next->adjvex==v2)

break;

}

returnp;

}

voidDetele(Graph*G,charv1,charv2){

inti=FindPosition(G,v1);

ArcNode*p;

//没有找到

if(i==-1)

return;

p=FindNode(G->vertices[i].first_head,v2);

//因为p是上一个节点的位置,用q来保存

//要删除的节点的地址

ArcNode*q=p->next;

//通过将上一个节点的next指针指向要删除节点的next指

//针志向的节点实现断开要删除节点的目的

//p->adjvex=p->next->adjvex;

p->next=p->next->next;

//删除要删除的节点q

deleteq;

}

//输出领接表

voidPrint(Graph*G){

ArcNode*p;

for(inti=0;icount;i++){

//先将data

cout<vertices[i].data<<"->";

//从每个顶点的头结点开始遍历

if(G->vertices[i].first_head->next!

=NULL){

p=G->vertices[i].first_head->next;

while(p!

=NULL){

cout<adjvex<<"->";

p=p->next;

}

}

cout<

}

cout<

}

Graph*G=newGraph;

intmain(){

NewNode(G,'A');

NewNode(G,'B');

NewNode(G,'C');

NewNode(G,'D');

Print(G);

SetSucc(G,'A','D');

SetSucc(G,'A','B');

SetSucc(G,'A','C');

SetSucc(G,'B','C');

SetSucc(G,'C','D');

SetSucc(G,'D','B');

Print(G);

Detele(G,'A','C');

Detele(G,'D','B');

Print(G);

SetSucc(G,'D','C');

Print(G);

return0;

}

五、已知一个图的顶点集为{a,b,c,d,e},其邻接矩阵如以下图,考虑图为无向图和有向图两种情况,分别画出该图。

六、已知一个连通图如以下图所示,分别给出一个按深度优先遍历和广度优先遍历的顶点序列〔假设从顶点v1出发〕。

并编程分别实现该图的邻接矩阵表示和邻接表表示,要求编写相关基本操作,并在主函数中求出深度优先序列和广度优先序列。

代码:

#include

#include

#include

#include

usingnamespacestd;

#definemax_n20

structArcNode{

charadjvex='#';

ArcNode*next=NULL;

};

typedefstructVNode{

chardata;

ArcNode*first_head;

}VNode,AdjList[max_n];

typedefstruct{

AdjListvertices;

intvisit[max_n]={0};//记录是否被访问过

intvexnum,arcnum;

intcount=0;

}Graph;

//新增一个顶点

charNewNode(Graph*G,charv){

G->vertices[G->count].data=v;

G->vertices[G->count].first_head=newArcNode;

G->count++;

returnv;

}

//寻找某个顶点的位置

intFindPosition(Graph*G,charv){

for(inti=0;icount;i++){

if(v==G->vertices[i].data)

returni;

}

}

//删除一个顶点

voidDelNode(Graph*G,charv){

inti=FindPosition(G,v);

//去头

ArcNode*p=G->vertices[i].first_head;

//现在vertices中删除

intj;

for(j=i;jcount-1;j++)

G->vertices[j]=G->vertices[j+1];

G->vertices[j].data='#';

G->vertices[j].first_head=NULL;

G->count--;

//删除边

ArcNode*q;

while(p!

=NULL){

q=p;

p=p->next;

q=NULL;

}

}

//设置v1到v2直接的一条边

voidSetSucc(Graph*G,charv1,charv2){

inti=FindPosition(G,v1);

ArcNode*p;

p=G->vertices[i].first_head;

while(p->next!

=NULL){

p=p->next;

}

ArcNode*

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

当前位置:首页 > 初中教育 > 中考

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

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