数据结构题库12
第六章 图
一、单项选择题
1.下面关于图的存储结构的叙述中正确的是 (1) 。
(1):A.用邻接矩阵存储图占用空间大小只与图中顶点有关,与边数无关
B.用邻接矩阵存储图占用空间大小只与图中边数有关,而与顶点数无关
C.用邻接表存储图占用空间大小只与图中顶点数有关,而与边数无关
D.用邻接表存储图占用空大小只与图中边数有关,而与顶点数无关
2.下面关于对图的操作的说法不正确的是 (2) 。
(2):A:寻找关键路径是关于带权有向图的操作
B.寻找关键路径是关于带权无向图的操作
C.连通图的生成树不一定是惟一的
D.带权无向图的最小生成树不一定是惟一的
3.下面的各种图中,哪个图的邻接矩阵一定是对称的 (3) 。
(3):A.AOE网 B.AOV网 C.无向图 D.有向图
4.在AOE网中关于关键路径叙述正确的是 (4) 。
(4):A.从开始顶点到完成顶点的具有最大长度的路径,关键路径长度是完成整个工程所需的最短时间
B.从开始顶点到完成顶点的具有最小长度的路径,关键路径长度是完成整个工程所需的最短时间
C.从开始顶点到完成顶点的具有最大长度的路径,关键路径长度是完成整个工程所需的最长时间
D.从开始顶点到完成顶点的具有最小长度的路径,关键路径长度是完成整个工程所需的最短时间
5.一个具有n个顶点e条边的图中,所有顶点的度数之和等于 (5)。
(5):A.n B.2n C.e D.2e
6.具有8个顶点的无向图最多有 (6) 条边。
(6):A.8 B.28 C.56 D.72
7.具有8个顶点的有向图最多有 (7) 条边。
(7):A.8 B.28 C.56 D.78
8.深度优先遍历类似于二叉树的 (8) 。
(9):A.前序遍历 B.中序遍历 C.后序遍历 D.层次遍历
9.广度优先遍历类似于二叉树的 (9) 。
(9):A.前序遍历 B.中序遍历 C.后序遍历 D.层次遍历
10.任一个连通图的生成树 (10) 。
(l0):A.可能不存在 B.只有一棵 C.一棵或多棵 D.一定有多棵
11.下列关于连通图的BFS和DFS生成树高度论述正确的是 (11)。
(11):A.BFS生成树高度<DFS生成树的高度
B.BFS生成树高度≤DFS生成树的高度
C.BFS生成树高度>DFS生成树的高度
D.BFS生成树高度≥DFS生成树的高度
12.G是一个非连通无向图,共有28条,则该图至少有解 (12) 个顶点。
(12):A.7 B.8 C.9 D.10
二、判断题
1.一个图的邻接矩阵表示是惟一的。 ( )
2.一个图的邻接表表示是惟一的。 ( )
3.无向图的邻接矩阵一定是对称矩阵。 ( )
4.有向图的邻接矩阵一定是对称矩阵。 ( )
5.有向图用邻接表表示,顶点vi的出度是对应顶点vj链表中结点个数。 ( )
6.有向图用邻接表表示,顶点vi的度是对应顶点vj链表中结点个数。 ( )
7.有向图用邻接矩阵表示,删除所有从顶点i出发的弧的方法是,将邻接矩阵的i行全部元素置为0。 ( )
8.若从无向图中任一顶点出发,进行一次深度优先搜索,就可以访问图中所有顶点,则该图一定是连通的。 ( )
9.在非连通图的遍历过程中,调用深度优先搜索算法的次数等于图中连通分量的个数。 ( )
10.具有n个顶点的有向强连通图的邻接矩阵中至少有n个小于∞的非零元素。 ( )
11.一个连通图的生成树是一个极小连通子图。 ( )
12.在有数值相同的权值存在时,带权连通图的最小生成树可能不惟一。 ( )
13.在AOE网中仅存在一条关键路径。 ( )
14.若在有向图的邻接矩阵中,主对角线以下的元素均为0,则该图一定存在拓扑有序序列。 ( )
15.若图C的邻接表表示时,表中有奇数个边结点,则该图一定是有向图。 ( )
16.在AOE网中,任何一个关键活动提前完成,整个工程都会提前完成。 ( )
17.图的深度优先遍历序列一定是惟一的。 ( )
18.有向无环图的拓扑有序序列一定是惟一的。 ( )
19.拓扑排序输出的顶点个数小于图中的顶点个数,则该图一定存在环。 ( )
三、填空题
1.在一个具有n个顶点的完全无向图和完全有向图中分别包含有 (1) 和 (2) 条边。
2.具有n个顶点的连通图至少具有 (3) 条边。
3.具有n个顶点e条边的有向图和无向图用邻接表表示,则邻接表的边结点个数分别为(4)和 (5) 条。
4.在有向图的邻接表和逆邻接表中,每个顶点链表中链接着该顶点的所有 (6) 和 (7)结点。
5.若n个顶点的连通图是一个环,则它有 (8) 棵生成树。
6.图的逆邻接表存储结构只适用于 (9) 。
7.n个顶点e条边的图采用邻接矩阵存储,深度优先遍历算法的时间复杂度是 (10) ,广度优先算法的时间复杂度是 (11) 。
8.n个顶点e条边的图,采用邻接表存储,广度优先遍历算法的时间复杂度是 (12) ,深度优先遍历算法的时间复杂度是 (13) 。
9.若要求一个稀疏图的最小生成树,最好用 (14) 算法求解。
10.若要求一个稠密图的最小生成树,最好用 (15) 算法求解。
四、应用题
1.已知图C=(V,E),其中V={a,b,c,d,e},E={(a,b),{a,c},{a,d},(b,c),(d,c),(b,e),(c,e),(d,e)}要求:
(1)画出图G;
(2)给出图G的邻接矩阵;
(3)给出图G的邻接表;
(4)给出图G的所有拓扑有序序列。
2.已知带权无向图的邻接表见下图,要求:
(1)画出图G。
(2)各画一棵从顶点a出发的深度优先生成树和广度优先生成树。
(3)给出用prim算法从顶点a出发构造最少生成树的过程。
(4)给出用Kruscal算法构造最小生成树的过程。
3.已知带权有向图如右图所示,要求:
(1)给出图G的邻接矩阵;
(2)给出图G的一个拓扑有序序列;
(3)求从顶点a出发到其余各顶点的最短路径。
4.已知带权有向图G见下图,图中边上的权值为完成活动ai需要的天数,要求:
(1)求每项活动的最早和最晚开工时间;
(2)完成此项工程最少需要多少天;
(3)给出图G的关键路径。
四、算法题
1.编写根据无向图G的邻接表,判断图G是否连通的算法。
2.编写根据有向图的邻接表,分别设计实现以下要求的算法:
(1)求出图G中每个顶点的出度;
(2)求出图G中出度最大的一个顶点,输出该顶点编号;
(3)计算图G中出度为0的顶点数;
(4)判断图G中是否存在边〈i,j〉。
参考答案
第六章
一、单项选择题
(1)-(4)AACA (5)-(9)DBCAD (10)-(11)CB
(12)图G是一个非连通分量,至少有两个连通分量。含8个顶点的完全无向图共需28条边,另外一个顶点构成一个连通分量,所以至少含9个顶点。
二、判断题
1.正确2.错误3.正确 4.错误5.正确6.错误 7.正确 8.正确 9.正确
10.正确(若n个顶点依次首尾相接构成一个环的有向强连通图,至少含n条边,即邻接矩阵中至少有n个小于u的非零元素)。
11.错误 12.正确 13.错误 14.正确 15.正确
16.错误 17.错误 18.错误 19.正确
三、填空题
(1)n(n-1)/2 (2)n(n-1) (3)n-1 (4)e (5)2e (6)出边 (7)人边 (8)n (9)有向图 (10)O(n2) (11)O(n2) (12)O(n+e) (13)O(n+e) (14)Kruscal (15)prim
四、算法题
1.将图的深度优先遍历或广度优先遍历算法稍加改造,另设m保存访问的顶点个数,若已访问顶点个数m小于图中顶点个数n,则图G不连通,否则为连通。现将深度优先遍历的非递归算法改造如下:
采用邻接表表示,类型定义如下:
#define MaxV 20
typedef struct node
{int adjvex;
struct node *next;
}Enode;
typedef struct
{int data;
Enode *firste;
}Vnode;
typedef struct
{Vnode adjlist[MaxV];
int n;
int e;
}ALGraph;
int connect(ALGraph *G)
{int i,j,Visited[MaxV],m=0,top=0;
Enode *p,*S[MaxV];
For(i=0;i<n;i++)
Visited[i]=0;
Visited[0]=0;
Printf(“%c”,G->adjlist[0].data);
m++;
S[top++]=p->next;
j=p->adjvex;
if(visited[j]0)
{visited[j]=1;
printf(“%c”,G->adjlist[j].data);
m++;
s[top++]=G->adjlist[j]->firste;
}
}
}
if(ma)
return(0);
else
return(1);}
2.(1)解:顺序计算每个顶点链表的表中结点个数,就是该顶点的出度.
算法如下:
void outdegree(graph g,int v)
{arcnode *p;
int n=0;
p=g.adjlist[v].firstarc;
while§
{ n++;
p=p->nextarc;}
}
return n;
}
void outds(graph g)
{ int i;
printf(“各顶点出度:、\n”);
for(i=0;i<g.vexnum;i++)
printf(“顶点%d:%d\n”,i,outdegree(g,i));
}
(2)void maxoutds(graph g)
{ int maxv=0,maxds=0i,x;
for(i=0;i<g.vexnum;i++)
{ x=outdegredd(g,i);
if(x>maxds)
{maxds=x;maxv=1;}
}
printf(“最大出度:顶点%d的出度%d”,maxv,maxds);
}
(3)void zerods(graph g)
{ int i,x;
printf(“出度为0的顶点:\n”);
for(i=0;i<g.vexnum;i++)
{ x=outdegree(g,i);
if(x0)
printf(“%d”,i);
}
}
(4)void arc(graph g)
{ int i,j;
arcnode *p;
printf(“输入边:\n”);
scanf(“%d,%d”,i,j);
p=g.adjlist[i].firstarc;
while(p!=NULL&&p->adjvex!=j)
p=p->nextarc;
if(p==NULL)
printf(“不存在!”);
else
printf(“存在<%d,%d>边:\n”,i,j);
}
原文地址:https://blog.csdn.net/m0_54748666/article/details/144311970
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!