南工大第四章图.docx
《南工大第四章图.docx》由会员分享,可在线阅读,更多相关《南工大第四章图.docx(30页珍藏版)》请在冰豆网上搜索。
南工大第四章图
数据结构与算法上机作业
第四章图
一、选择题
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;jG->vexs[j]=G->vexs[j+1];
G->count--;
//删除边
//先删除行
intp=i;//记住位置
for(i=p;ifor(j=0;jG->arcs[i][j]=G->arcs[i+1][j];
//再删除列
for(i=p;ifor(j=0;jG->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*