习题集解析部分
第7章 图
——《数据结构题集》-严蔚敏.吴伟民版
源码使用说明 链接☛☛☛ 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
课本源码合辑 链接☛☛☛ 《数据结构》课本源码合辑
习题集全解析 链接☛☛☛ 《数据结构题集》习题解析合辑
相关测试数据下载 链接☛ 数据包
本习题文档的存放目录:数据结构\▼配套习题解析\▼07 图
文档中源码的存放目录:数据结构\▼配套习题解析\▼07 图\▼习题测试文档-07
源码测试数据存放目录:数据结构\▼配套习题解析\▼07 图\▼习题测试文档-07\Data
一、基础知识题
7.1❶已知如下图所示的有向图,请给出该图的
(1)每个顶点的入/出度;
(2)邻接矩阵;
(3)邻接表;
(4)逆邻接表;
(5)强连通分量。
7.2❷已知有向图的邻接矩阵为An×n,试问每一个A(k)n×n(k=1,2,…,n)各具有何种实际含义?
7.3❷画出下图所示的无向图的邻接多重表,使得其中每个无向边结点中第一个顶点号小于第二个顶点号,且每个顶点的各邻接边的链接顺序,为它所邻接到的顶点序号由小到大的顺序。列出深度优先和广度优先搜索遍历该图所得顶点序列和边的序列。
7.4❷试对以下所示的无向图,画出其广度优先生成森林。
7.5❷已知以二维数组表示的图的邻接矩阵如下图所示。试分别画出自顶点1出发进行遍历所得的深度优先生成树和广度优先生成树。
7.6❺试证明教科书7.4.2节中求强连通分量的算法(深度优先搜索)的正确性。
7.7❷请对下图的无向带权图,
(1)写出它的邻接矩阵,并按普里姆算法求其最小生成树;
(2)写出它的邻接表,并按克鲁斯卡尔算法求其最小生成树。
7.8❷试对以下所示无向图执行求关节点的算法,分别求出每个顶点的visited[i]和low[i]值,i=1,2, …,vexnum。
7.9❷试列出下图中全部可能的拓扑有序序列,并指出应用7.5.1节中算法Topological Sort求得的是哪一个序列(注意:应先确定其存储结构)。
7.10❷对于下图所示的AOE网络,计算各活动弧的e(ai)和l(aj)函数值、各事件(顶点)的ve(vi)和vl(vj)函数值;列出各条关键路径。
7.11❷试利用Dijkstra算法求下图中从顶点a到其他各顶点间的最短路径,写出执行算法过程中各步的状态。
7.12❹试证明求最短路径的Dijkstra算法的正确性。
7.13❷试利用Floyd算法求下图所示有向图中各对顶点之间的最短路径。
转载注明出处:原文链接
二、算法设计题
邻接表
7.14❸编写算法,由依次输入的顶点数目、弧的数目、各顶点的信息和各条弧的信息建立有向图的邻接表。
邻接矩阵
7.15❸试在邻接矩阵存储结构上实现图的基本操作:InsertVex(G,v),InsertArc(G,v,w),DeleteVex(G,v)和DeleteArc(G,v,w)。
邻接表
7.16❸试对邻接表存储结构重做7.15题。
十字链表
7.17❸试对十字链表存储结构重做7.15题。
邻接多重表
7.18❸试对邻接多重表存储结构重做7.15题。
7.19❸编写算法,由依次输入的顶点数目、边的数目、各顶点的信息和各条边的信息建立无向图的邻接多重表。
邻接矩阵
7.20❸下面的算法段可以测定图G=(V,E)是否可传递: trans = TRUE; for(V中的每个x) for(N(x)中的每个y) for(N(y)中不等于x的每个z) if(z不在N(x)中) trans = FALSE; 其中N(x)表示x邻接到的所有顶点的集合。试以邻接矩阵存储结构实现判定一个图的可传递性的算法,并通过n=|V|,m=|E|和d=结点度数的均值,估计执行时间。
邻接表
7.21❸试对邻接表存储结构重做7.20题。
7.22❸试基于图的深度优先搜索策略写一算法,判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点vj的路径(i≠j)。注意:算法中涉及的图的基本操作必须在此存储结构上实现。
7.23❸同7.22题要求。试基于图的广度优先搜索策略写一算法。
邻接矩阵
7.24❸试利用栈的基本操作编写,按深度优先搜索策略遍历一个强连通图的非递归形式的算法。算法中不规定具体的存储结构,而将图Graph看成是一种抽象的数据类型。
类似邻接表
7.25❺假设对有向图中n个顶点进行自然编号,并以三个数组s[1…max],fst[1…n]和lst[1…n]表示之。其中数组s存放每个顶点的后继顶点的信息,第i个顶点的后继顶点存放在s中下标从fst[i]起到lst[i]的分量中(i=1,2,…,n)。若fst[i]>lst[i],则第i个顶点无后继顶点。试编写判别该有向图中是否存在回路的算法。
邻接矩阵
7.26❺试证明,对有向图中顶点适当地编号,可使其邻接矩阵为下三角形且主对角线为全零的充要条件是:该有向图不含回路。然后写一算法对无环有向图的顶点重新编号,使其邻接矩阵变为下三角形,并输出新旧编号对照表。
邻接表
7.27❹采用邻接表存储结构,编写一个判别无向图中任意给定的两个顶点之间是否存在一条长度为k的简单路径的算法(一条路径为简单路径指的是其顶点序列中不含有重现的顶点)。
7.28❺已知有向图和图中两个顶点u和v,试编写算法求有向图中从u到v的所有简单路径,并以下图为例手工执行你的算法,画出相应的搜索过程图。
邻接矩阵
7.29❺试写一个算法,在以邻接矩阵方式存储的有向图G中求顶点i到顶点j的不含回路的、长度为k的路径数。
7.30❺试写一个求有向图G中所有简单回路的算法。
十字链表
7.31❸试完成求有向图的强连通分量的算法,并分析算法的时间复杂度。
邻接表
7.32❷试修改普里姆算法,使之能在邻接表存储结构上实现求图的最小生成森林,并分析其时间复杂度(森林的存储结构为孩子-兄弟链表)。
7.33❺已知无向图的边集存放在某个类型为EdgeSetType的数据结构EdgeSet 中(没有端点相重的环边),并在此结构上已定义两种基本运算:
(1)函数GetMinEdge(EdgeSet, u, v):若EdgeSet非空,则必存在最小边,变参u和v分别含最小边上两顶点,并返回true;否则返回false;
(2)过程DelMinEdge(EdgeSet, u, v):从EdgeSet中删除依附于顶点u和v的最小边。 试在上述结构上实现求最小生成树(以孩子-兄弟链表表示)的克鲁斯卡尔算法。
7.34❸试编写一个算法,给有向无环图G中每个顶点赋以一个整数序号,并满足以下条件:若从顶点i至顶点j有一条弧,则应使i<j。
7.35❹若在DAG(有向无环图)图中存在一个顶点r,在r和图中所有其他顶点之间均存在由r出发的有向路径,则称该DAG图有根。试编写求DAG图的根的算法。
7.36❹在图的邻接表存储结构中,为每个顶点增加一个MPL域。试写一算法,求有向无环图G的每个顶点出发的最长路径的长度,并存入其MPL域。请给出算法的时间复杂度。
7.37❺试设计一个求有向无环图中最长路径的算法,并估计其时间复杂度。
7.38❸一个四则运算算术表达式以有向无环图的邻接表方式存储,每个操作数原子都由单个字母表示。写一个算法输出其逆波兰表达式。
二叉链表
7.39❸把存储结构改为二叉链表,重做7.38题。
邻接表
7.40❸若7.38题的运算符和操作数原子分别由字符和整数表示,请设计邻接表的结点类型,并且写一个表达式求值的算法。
7.41❹试编写利用深度优先遍历有向图实现求关键路径(CPM)的算法。
7.42❹以邻接表作存储结构实现求从源点到其余各顶点的最短路径的Dijkstra算法。