数据结构第七章图.docx
- 文档编号:30141194
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:20
- 大小:165.44KB
数据结构第七章图.docx
《数据结构第七章图.docx》由会员分享,可在线阅读,更多相关《数据结构第七章图.docx(20页珍藏版)》请在冰豆网上搜索。
数据结构第七章图
数据结构习题(图)
一、选择题
1.设完全无向图的顶点个数为n,则该图有( B)条边。
A.n-l B.n(n-l)/2 C.n(n+l)/2 D.n(n-l)
2.在一个无向图中,所有顶点的度数之和等于所有边数的( )倍。
A.3 B.2 C.1 D.1/2
3.有向图的一个顶点的度为该顶点的( )。
A.入度 B.出度 C.入度与出度之和 D.(入度+出度)/2
4.在无向图G(V,E)中,如果图中任意两个顶点vi、vj(vi、vj∈V,vi≠vj)都的,则称该图是( )。
A.强连通图 B.连通图 C.非连通图 D.非强连通图
5.若采用邻接矩阵存储具有n个顶点的一个无向图,则该邻接矩阵是一个( )。
A.上三角矩阵 B.稀疏矩阵
C.对角矩阵 D.对称矩阵
6.若采用邻接矩阵存储具有n个顶点的一个有向图,顶点vi的出度等于邻接矩阵
A.第i列元素之和 B.第i行元素之和减去第i列元素之和
C.第i行元素之和 D.第i行元素之和加上第i列元素之和
7.对于具有e条边的无向图,它的邻接表中有( )个边结点。
A.e-l B.e C.2(e-l) D.2e
8.对于含有n个顶点和e条边的无向连通图,利用普里姆Prim算法产生最小生成时间复杂性为( ),利用克鲁斯卡尔Kruskal算法产生最小生成树(假设边已经按权的次序排序),其时间复杂性为( )。
A.O(n2) B.O(n*e) C.O(n*logn) D.O(e)
9.对于一个具有n个顶点和e条边的有向图,拓扑排序总的时间花费为O( )
A.n B.n+l C.n-l D.n+e
10.在一个带权连通图G中,权值最小的边一定包含在G的( )生成树中。
A.最小 B.任何 C.广度优先 D.深度优先
二、填空题
1.在一个具有n个顶点的无向完全图中,包含有____条边;在一个具有n个有向完全图中,包含有____条边。
2.对于无向图,顶点vi的度等于其邻接矩阵____的元素之和。
3.对于一个具有n个顶点和e条边的无向图,在其邻接表中,含有____个边对于一个具有n个顶点和e条边的有向图,在其邻接表中,含有_______个弧结点。
4.十字链表是有向图的另一种链式存储结构,实际上是将_______和_______结合起来的一种链表。
5.在构造最小生成树时,克鲁斯卡尔算法是一种按_______的次序选择合适的边来构造
最小生成树的方法;普里姆算法是按逐个将_______的方式来构造最小生成树的另一种方法。
6.对用邻接表表示的图进行深度优先遍历时,其时间复杂度为一;对用邻接表表示的图进行广度优先遍历时,其时间复杂度为_______。
7.对于一个具有n个顶点和e条边的连通图,其生成树中的顶点数为_______,边数为_______。
8.在执行拓扑排序的过程中,当某个顶点的入度为零时,就将此顶点输出,同时将该顶点的所有后继顶点的入度减1。
为了避免重复检测顶点的入度是否为零,需要设立一个____来存放入度为零的顶点。
三、简答题
l.回答以下问题:
(1)有n个顶点的无向连通图最多需要多少条边?
最少需要多少条边?
(2)表示一个具有1000个顶点、1000条边的无向图的邻接矩阵有多少个矩阵元素?
有多少非零元素?
是否为稀疏矩阵?
2.题图7-1为一有向图,按要求回答问题:
(1)写出各顶点的入度、出度和度。
(2)给出该图的邻接矩阵。
(3)给出该图的邻接表。
(4)给出该图的十字链表。
3.题图7-2为一无向图,请按要求回答问题:
(1)画出该图的邻接表。
(2)画出该图的邻接多重表。
(3)分别写出从顶点1出发按深度优先搜索遍历算法得到的顶点序列和按广度优先搜索
遍历算法得到的顶点序列。
4.题图7-3为一带权无向图,请按要求回答问题。
(1) 画出该图的邻接矩阵,并按普里姆算法求其最小生成树。
(2)画出该图的邻接表,并按克鲁斯卡尔算法求其最小生成树。
5.题图7-4是一带权有向图,试采用狄杰斯特拉Dijkstra算法求从顶点1到其他各项点的最短路径,要求给出整个计算过程。
6.题图7-5为一个带权有向图
(1)给出该图的邻接矩阵。
(2)请用弗洛伊德算法求出各顶点对之间的最短路径长度,要求写出其相应的矩阵序列。
7.对于有向无环图,
(1)叙述求拓扑有序序列的步骤。
(2)对于题图7-6所示的有向图,写出它的4个不同的拓扑有序序列。
8.题图7-7是一个AOE网,试求:
(1)每项活动的最早开始时间和最迟开始时间。
(2)完成整个工程至少需要多少天。
(3)哪些是关键活动。
(4)是否存在某些活动,当提高其速度后能使整个工期缩短。
四、算法设计题
1.编写一个算法,判断图G中是否存在从顶点vi到vj的长度为k的简单路径。
2.以邻接表作为图的存储结构,编写实现连通图G的深度优先搜索遍历(从顶点v出发)的非递归函数。
3.给定n个村庄之间的交通图。
若村庄i与村庄j之间有路可通,则将顶点i与顶点j之间用边连接,边上的权值Wij表示这条道路的长度。
现打算在这n个村庄中选定一个村庄建一所医院。
试编写一个算法,求出该医院应建在哪个村庄,才能使距离医院最远的村庄到医院的路程最短。
4.编写一个函数,计算给定的有向图的邻接矩阵的每对顶点之间的最短路径。
第七章图
第7章图
一、选择题(参考答案):
1.B 2.B 3.C 4.B 5.D
6.C 7.D 8.A,D 9.D 10.A
二、填空题(参考答案)
1.n(n-l)/2,n(n-l)。
2.第i行。
3.2e,e0 4.邻接表,逆邻接表。
5.权值递增,顶点连通。
6.O(e),O(e)。
7.n,n-l。
8.栈。
三、简答题
1.回答以下问题:
(1)有n个顶点的无向连通图最多需要多少条边?
最少需要多少条边?
(2)表示一个具有1000个顶点、1000条边的无向图的邻接矩阵有多少个矩阵元素?
有多少非零元素?
是否为稀疏矩阵?
【解答】(l)有n个顶点的无向连通图最多有n(n-l)/2条边(构成一个无向完全图的情况);最少有n-l条边(n个顶点是连通的)。
(2)这样的矩阵共有lOOO*1000=1000000个矩阵元素,因为有1000条边,所以有2000非零元素,因此该矩阵是稀疏矩阵。
2.题图7-1为一有向图,按要求回答问题:
题图7-1
(1)写出各顶点的入度、出度和度。
(2)给出该图的邻接矩阵。
(3)给出该图的邻接表。
(4)给出该图的十字链表。
【解答】(l)各顶点入度、出度和度如下表所示。
(2)邻接矩阵如下所示。
0 0 0 0 0 0
1 0 0 1 0 0
0 1 0 0 0 1
0 0 1 0 1 1
1 0 0 0 0 0
1 1 0 0 1 0
(3)邻接表如下所示。
(4)十字接表如下所示。
3.题图7-2为一无向图,请按要求回答问题:
(1)画出该图的邻接表。
(2)画出该图的邻接多重表。
(3)分别写出从顶点l出发按深度优先搜索遍历算法得到的顶点序列和按广度优先搜索
遍历算法得到的顶点序列。
题图7-2
【解答】
(1)邻接表如下所示。
(2)多重邻接表如下所示。
(3)从顶点1出发,深度优先搜索遍历序列为:
123456;广度优先搜索遍历序列为:
123564。
4.题图7-3为一带权无向图,请按要求回答问题:
(1)画出该图的邻接矩阵,并按普里姆算法求其最小生成树。
(2)画出该图的邻接表,并按克鲁斯卡尔算法求其最小生成树。
【解答】
(1)按普里姆算法其最小生成树如下所示。
(2)按克鲁斯卡尔算法其最小生成树如下所示。
5.题图7-4是一带权有向图,试采用狄杰斯特拉
Dijkstra算法求从顶点l到其他各顶点的最短路径,要求给出整个计算过程。
【解答】
(1)初值:
s[]={1),dist[]={0,20,15,∞,
∞,∞}(顶点1到其他各项点的权值),path[]={1,1,1,
-l,-1,-1)(顶点l到其他各项点有弧存在时为1,否则
为-1)。
(2)在V-S中找最近(dist[]最小)的顶点3,加入S中,即s[]={l,3),并重新计算顶点l到达顶点2,4,5和6的距离,修改相应的dist值:
dist[2]=min{dist[2], dist[3]+cost[3][2]}=min{20, 15+4}=19;
dist[6l=min{dist[6],dist[3]+cost[3][6]}==Inin{∞,15+10}=25;
则有dist[]={0,19,15,∞,∞,25},path[]={l,3,1,-l,-l,3}。
(3)在V-S中找出最近的顶点4,加入S中,即s[]={1,3,2},并重新计算顶点1到达顶点4,5和6的距离,修改相应的dist值:
dist[5]-min{dist[5], dist[2]+cost[2][5])-min{∞,19+10}=29,
则有dist[]={0,19,15,∞,29,25),path[]={l,3,l,-1,2,3}.
(4)在V-S中找出最近的顶点6,加入S中,即s[].{1,3,2,6),并重新计算顶点l到达顶点4和5的距离,修改相应的dist值:
dist[4]=min{dist[4],dist[6]+cost[6][4])=min{∞..,25+4}=29,
则有dist[]={0,19,15,29,29,25},path[]={l,3,1,6,2,3}。
(5)在V-S中找出最近的顶点4,加入S中,即s[]:
{l,3,2,6,4},并重新计算顶点l到达顶点5的距离,此时不需要修改dist值,则有dist[]={0,19,15,29,29,25),path[]={l,3, l,6,2, 3}。
(6)在V-S中找出最近的顶点5,加入S中,即s口={l,3,2,6,4,5}。
此时S中包含了图的所有顶点,算法结束。
最终dist[]={0,19,15,29,29,25),path[]={1,3,l,6,2, 3}。
由此得到:
从顶点1到顶点2的最短路径长度为:
19 最短路径为:
2<-3<-1
从顶点l到顶点3的最短路径长度为:
15 最短路径为:
3<-1
从顶点l到顶点4的最短路径长度为:
29 最短路径为:
4<-6<-3<-1
从顶点l到顶点5的最短路径长度为:
29 最短路径为:
5<-2<-3<-l
从顶点l到顶点6的最短路径长度为:
25 最短路径为:
6<-3<-1
6.题图7-5为一个带权有向图,
(1)给出该图的邻接矩阵。
(2)请用弗洛伊德算法求出各顶点对之间的最短路径长度,要求写出其相应的矩阵序列。
【解答】
(1)邻接矩阵如下:
0 10 ∞ ∞
15 0 6 ∞
3 ∞ 0 4
∞ 8 2 0
(2)采用弗洛伊德算法求最短路径的过程如下:
7.对于有向无环图,
(1)叙述求拓扑有序序列的步骤。
(2)对于题图7-6所示的有向图,写出它的4个不同的拓扑有序序列。
【解答】
(1)参见7.6节的介绍。
(2)它的4个不同的拓扑有序序列是:
12345678,12354678,12347856,12347568。
8.题图7-7是一个AOE网,试求:
(l)每项活动的最早开始时间和最迟开始时间。
(2)完成整个工程至少需要多少天(设弧上权值为天数)。
(3)哪些是关键活动。
(4)是否存在某些活动,当提高其速度后能使整个工期缩短。
【解答】
(1)所有活动的最早开始时间e(i)、最迟开始时间l(i)以及d(i)=1(i)一e(i),如下所示。
(2)完成此工程最少需要23天。
(3)从以上计算得出关键活动为:
a2,a4,a6,a8,a9,aio,a12,a13和a14。
(4)存在a2,a4,al4活动,当其提高速度后能使整个工程缩短工期。
四、算法设计题
1.编写一个算法,判断图G中是否存在从顶点vi到vj的长度为k的简单路径。
【解答】采用深度优先遍历算法来判断图G中是否存在从顶点vi到vj的长度为k的简单路径。
其中,变量n用于记录经过的顶点数,当n=k+l时,表示路径长度为k;suc记录是否成功地找到了所求路径。
算法如下所示。
#defineMax<一个大于顶点数的常量>
int visited[Max], //全局变量
intexist(ALGraph*g,int vi;int Vj,intk)
{
inti,suc;
for(i=O;i
visited[i]=0;
suc=0;n=0;
dfs(g,vi,Vj,suc,k);
returnsuc;
}
voiddfs(ALGraph*g,intV,int Vj,int &suc,intk)
{
ArcNode*p;
Visited[v]=l;
n++;
if(n==k+l&&v==vj)suc=l; //找到了满足题意的路径
if(n p=g->adjlist[v]->firstarc; while(p! =NULL&&suc==0){ if(visited[p->adjvex]==0){ dfs(g,p->adjvex,Vj,suc,k)j n--; } p=p->nextarc; } } } 2.以邻接表作为图的存储结构,编写实现连通图G的深度优先搜索遍历(从顶点v出发)的非递归函数。 【算法基本思想】第一步,首先访问图G的指定起始顶点v;第二步,从v出发,访问一个与V邻接且未被访问的顶点p,再从顶点p出发,访问与p邻接且未被访问的顶点q,如此重复,直到找不到未访问过的邻接顶点为止;第三步,退回到尚有未被访问过的邻接点的顶点,从该顶点出发,重复第二、三步,直到所有被访问过的顶点的邻接点都已被访问为止。 为此,用一个栈保存被访问过的结点,以便回溯查找已被访问结点的未被访问过的邻接点。 具体函数如下: #defineMAXVEX100 //定义顶点数的最大值 Voiddfs (AdjListg,intv,intn) //n表示顶点数 { Struct ArcNode *stack[MAXVEX],*p; int visited[MAXVEX],top=0,i; for(i-0,i printf(¨%d\n¨,v); p=g[v].firstarc; while (top>0||p) { while(p) if(visited[p->adjvex]==0) p=p->nextarc //查找下一邻接点 else { printf(¨%d\n¨,p->adjvex); visited[p->adjvex]=l; top++; //将访问过的结点入栈 stack[top]=p; p=g[p->adjveX].firstarc; } if(top>0) { p=stack[top]; top--; //退钱,回溯查找已被访问结点的未被访问过的邻接点 p=p->nextarc; } } } 3.给定n个村庄之间的交通图。 若村庄i与村庄j之间有路可通,则将顶点i与顶点j之间用边连接,边上的权值Wij表示这条道路的长度。 现打算在这n个村庄中选择一个村庄建一所医院。 试编写一个算法,求出该医院应建在哪个村庄,才能使距离医院最远的村庄到医院的路程最短。 将n个村庄的交通图用邻接矩阵A表示。 【算法思路】先应用弗洛伊德算法计算每对顶点之间的最短路径;然后找出从每一个顶 点到其他各顶点的最短路径中最长的路径;最后在这n条最长路径中找出最短的一条。 算法如 下: #definen<村庄个数> intmaxminpath(floatA[n][n]) { inti,j,k; floats.min=10000; //最短路径长度min置初值10000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第七