南工大第四章图Word文件下载.docx
- 文档编号:18828805
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:30
- 大小:1.20MB
南工大第四章图Word文件下载.docx
《南工大第四章图Word文件下载.docx》由会员分享,可在线阅读,更多相关《南工大第四章图Word文件下载.docx(30页珍藏版)》请在冰豆网上搜索。
13、设图有n个顶点和e条边,求解最短路径的Floyd算法的时间复杂度为O。
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<
iostream>
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;
count++;
returnv;
}
//寻找某个顶点的位置
intFindPosition(Graph*G,charv){
for(inti=0;
i<
G->
count;
i++){
if(v==G->
vexs[i])
returni;
}
}
voidDelete(Graph*G,charv){
//先删除点
inti,j;
inttemp_count=G->
i=FindPosition(G,v);
for(j=i;
j<
temp_count;
j++)
vexs[j]=G->
vexs[j+1];
count--;
//删除边
//先删除行
intp=i;
//记住位置
for(i=p;
temp_count-1;
i++)
for(j=0;
j++)
arcs[i][j]=G->
arcs[i+1][j];
//再删除列
for(i=p;
arcs[j][i]=G->
arcs[j][i+1];
//建立v1与v2的一条边
voidSetSoucc(Graph*G,charv1,charv2){
//先找到对应的定的位置
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;
arcs[j][i]=1;
voidDelSucc(Graph*G,charv1,charv2){
arcs[i][j]=0;
arcs[j][i]=0;
//判断v1y与v2是否连接
boolisEdge(Graph*G,charv1,charv2){
return-1;
if(G->
arcs[i][j]==1)
returntrue;
returnfalse;
voidPrint(Graph*G){
for(i=0;
for(j=0;
cout<
<
arcs[i][j]<
"
"
;
endl;
cout<
Graph*G=newGraph;
//初始化
intmain(){
count=0;
NewNode(G,'
A'
);
B'
C'
D'
//插入边
SetSoucc(G,'
'
Print(G);
//删除一个顶点
Delete(G,'
//删除边
DelSucc(G,'
Print(G);
if(isEdge(G,'
))
A与B右边"
return0;
四、已知一个有向图如下图所示,试给出图的邻接矩阵和邻接表存储示意图(画图,分别用矩阵和数组链表图表示),并编程分别实现该图的邻接矩阵表示和邻接表表示,要求编写两种表示方法的存储结构、相关基本操作,并在主函数中创建该图。
#include<
stdio.h>
stdlib.h>
#definemax_n20
structArcNode{
charadjvex='
#'
ArcNode*next=NULL;
};
typedefstructVNode{
chardata;
ArcNode*first_head;
}VNode,AdjList[max_n];
typedefstruct{
AdjListvertices;
intvexnum,arcnum;
intcount=0;
//新增一个顶点
charNewNode(Graph*G,charv){
vertices[G->
count].data=v;
count].first_head=newArcNode;
vertices[i].data)
//删除一个顶点
voidDelNode(Graph*G,charv){
inti=FindPosition(G,v);
//去头
ArcNode*p=G->
vertices[i].first_head;
//现在vertices中删除
intj;
for(j=i;
count-1;
vertices[j]=G->
vertices[j+1];
vertices[j].data='
vertices[j].first_head=NULL;
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!
}
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)
p=FindNode(G->
vertices[i].first_head,v2);
//因为p是上一个节点的位置,用q来保存
//要删除的节点的地址
ArcNode*q=p->
//通过将上一个节点的next指针指向要删除节点的next指
//针志向的节点实现断开要删除节点的目的
//p->
adjvex=p->
adjvex;
p->
next=p->
//删除要删除的节点q
deleteq;
//输出领接表
for(inti=0;
//先将data
cout<
vertices[i].data<
->
//从每个顶点的头结点开始遍历
if(G->
vertices[i].first_head->
p=G->
while(p!
cout<
p->
adjvex<
p=p->
}
cout<
Graph*G=newGraph;
intmain(){
SetSucc(G,'
Detele(G,'
五、已知一个图的顶点集为{a,b,c,d,e},其邻接矩阵如下图,考虑图为无向图和有向图两种情况,分别画出该图。
六、已知一个连通图如下图所示,分别给出一个按深度优先遍历和广度优先遍历的顶点序列(假设从顶点v1出发)。
并编程分别实现该图的邻接矩阵表示和邻接表表示,要求编写相关基本操作,并在主函数中求出深度优先序列和广度优先序列。
queue>
structArcNode{
typedefstructVNode{
intvisit[max_n]={0};
//记录是否被访问过
//新增一个顶点
intFindPosition(Graph*G,charv){
i<
i++){
returni;
voidDelNode(Graph*G,charv){
j<
j++)
=NULL){
//设置v1到v2直接的一条边
voidSetSucc(Graph*G,charv1,charv2){
p=G->
q->
adj
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 南工大 第四
![提示](https://static.bdocx.com/images/bang_tan.gif)