数据结构-第七章图:习题(共13页).docx
精选优质文档-倾情为你奉上第七章图:习题习 题一、选择题 1设完全无向图的顶点个数为n,则该图有( )条边。 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、vjV,vivj)都的,则称该图是( )。 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章图一、选择题(参考答案):1B 2B 3C 4B 5D6. C 7D 8A,D 9D 10.A二、填空题(参考答案)1n(n-l)/2, n(n-l)。 2第i行。3. 2e, e0 4邻接表,逆邻接表。5权值递增,顶点连通。 6O(e),O(e)。7n,n-l。 8栈。三、简答题1回答以下问题: (1)有n个顶点的无向连通图最多需要多少条边?最少需要多少条边? (2)表示一个具有1000个顶点、1000条边的无向图的邻接矩阵有多少个矩阵元素?有多少非零元素?是否为稀疏矩阵? 【解答】(l)有n个顶点的无向连通图最多有n(n-l)/2条边(构成一个无向完全图的情况);最少有n-l条边(n个顶点是连通的)。 (2)这样的矩阵共有lOOO*1000=个矩阵元素,因为有1000条边,所以有2000非零元素,因此该矩阵是稀疏矩阵。 2题图7-1为一有向图,按要求回答问题:题图7-1 (1)写出各顶点的入度、出度和度。 (2)给出该图的邻接矩阵。 (3)给出该图的邻接表。 (4)给出该图的十字链表。【解答】(l)各顶点入度、出度和度如下表所示。 (2)邻接矩阵如下所示。0 0 0 0 0 01 0 0 1 0 00 1 0 0 0 10 0 1 0 1 11 0 0 0 0 01 1 0 0 1 0 (3)邻接表如下所示。 (4)十字接表如下所示。 3题图7-2为一无向图,请按要求回答问题: (1)画出该图的邻接表。 (2)画出该图的邻接多重表。 (3)分别写出从顶点l出发按深度优先搜索遍历算法得到的顶点序列和按广度优先搜索遍历算法得到的顶点序列。题图7-2 【解答】(1)邻接表如下所示。(2)多重邻接表如下所示。(3)从顶点1出发,深度优先搜索遍历序列为:;广度优先搜索遍历序列为:。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值: dist2=mindist2, dist3+cost32=min20, 15+4=19; dist6l=mindist6, dist3+cost36=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值: dist5-mindist5, dist2+ cost25)-min,19+10=29, 则有dist=0,19,15, ,29,25),path=l,3,l,-1,2,3. (4)在V-S中找出最近的顶点6,加入S中,即s1,3,2,6),并重新计算顶点l到达顶点4和5的距离,修改相应的dist值: dist4=mindist4, dist6+cost64)=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个不同的拓扑有序序列是:,。 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记录是否成功地找到了所求路径。算法如下所示。 #define Max<一个大于顶点数的常量> int visited Max, /全局变量 int exist (ALGraph *g,int vi; int Vj, intk) int i,suc; for(i=O;i<g->n;i十+) /置初值 visited i =0; suc=0; n=0; dfs (g, vi, Vj, suc,k); return suc; void dfs (ALGraph *g,int V,int Vj, int &suc, int k) ArcNode *p; Visited v =l; n+; if (n=k+lv=vj)suc=l; /找到了满足题意的路径 if(n<k+1) p=g->adj listv ->firstarc; while(p!=NULL&& suc=0) if (visitedp->adj vex =0) dfs (g, p->adjvex, Vj, suc,k)j n-; p=p->nextarc; 2以邻接表作为图的存储结构,编写实现连通图G的深度优先搜索遍历(从顶点v出发)的非递归函数。 【算法基本思想】第一步,首先访问图G的指定起始顶点v;第二步,从v出发,访问一个与V邻接且未被访问的顶点p,再从顶点p出发,访问与p邻接且未被访问的顶点q,如此重复,直到找不到未访问过的邻接顶点为止;第三步,退回到尚有未被访问过的邻接点的顶点,从该顶点出发,重复第二、三步,直到所有被访问过的顶点的邻接点都已被访问为止。为此,用一个栈保存被访问过的结点,以便回溯查找已被访问结点的未被访问过的邻接点。具体函数如下: #define MAXVEX 100 /定义顶点数的最大值 Void dfs (Adj List g,int v,int n) /n表示顶点数 Struct ArcNode *stackMAXVEX,*p; int visited MAXVEX, top=0,i; for (i-0,i<n,i+) visitedti =0; /结点访问标志均置为O printf(¨%dn¨,v); p=gvfirstarc; while (top>0|p) while (p) if (visitedp->adj vex =0) p=p->nextarc /查找下一邻接点 else printf(¨%dn¨, p->adjvex); visited p->adjvex =l; top+; /将访问过的结点入栈 stacktop =p; p=g p->adj veX.firstarc; if (top>0) p=stack top; top-; /退钱,回溯查找已被访问结点的未被访问过的邻接点 p=p->nextarc; 3给定n个村庄之间的交通图。若村庄i与村庄j之间有路可通,则将顶点i与顶点j之间用边连接,边上的权值Wij表示这条道路的长度。现打算在这n个村庄中选择一个村庄建一所医院。试编写一个算法,求出该医院应建在哪个村庄,才能使距离医院最远的村庄到医院的路程最短。 将n个村庄的交通图用邻接矩阵A表示。 【算法思路】先应用弗洛伊德算法计算每对顶点之间的最短路径;然后找出从每一个顶点到其他各顶点的最短路径中最长的路径;最后在这n条最长路径中找出最短的一条。算法如下: #define n<村庄个数> int maxminpath (float An n) int i,j,k; float s.min=10000; /最短路径长度min置初值10000 for(k=O;k<n;k+) /应用弗洛伊德算法计算每对村庄之间的最短路径 for(i=O;i<n;i+) for(j=0;j<n;j+) if (Aik+Akj<Aij) Aij=Aik+Akj; k=-l; f。r(i=O; i<n;i+) /对每个村庄循环一次 s=0; f。r(j=0;j<n;j+) /求l村庄到其他村庄最长的一条最短路径 if(Aij>s) s=Aij; if (s<min) /在各最长路径中选最短的一条,将该村庄放在k中 k=i; min=s; return k: 4编写一个函数计算给定的有向图的邻接矩阵的每对顶点之间的最短路径。本题实质上就是狄杰斯特拉算法。 【算法思想】假设原点为v: (l)置集合s的初态为空。 (2)把顶点v放入集合s中。 (3)确定从v开始的n-l条路径。 (4)选择最短距离的顶点u。 (5)把顶点u加入集合s中。 (6)更改距离。 【解答】具体实现如下: #define MAXVEX 100 /定义顶点数的最大值 void Shortestpath (int v,int cost MAXVEX MAXVEX, int dist MAXVEX, int)/最终的distj(1jn)为从顶点v到项点j之间的最短路径长度 f int smAXVEXl,i.u,nux,w; for(i=O;in-l; i+) /置集合s的初态为空 si=O; disti =costvi; s v=1; /把顶点v放入集合s dist v =O; num=0; while (num<n) /确定从顶点v开始的n-l条路径 U=Choose(s,dist,n); su=l; num+; /把顶点u放入s for (w=0;w<n;w+) if ( !sw) if (distu+cost u w <distw) dist w =distu+costu w; 其中函数choose0的功能是返回满足条件distu=minimum(distw),且sw=0的顶点u。定义如下: int choose (int s,int dist,int n) int min, i=O,u; while (si =1) i+, min=dist i; u=i; while (i<n) if(si=1)i+; else if (min>disti u=i; min=dist i i+; return U: 专心-专注-专业