数据结构-图习题

上传人:小** 文档编号:94596910 上传时间:2019-08-09 格式:DOC 页数:15 大小:253.50KB
返回 下载 相关 举报
数据结构-图习题_第1页
第1页 / 共15页
数据结构-图习题_第2页
第2页 / 共15页
数据结构-图习题_第3页
第3页 / 共15页
数据结构-图习题_第4页
第4页 / 共15页
数据结构-图习题_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《数据结构-图习题》由会员分享,可在线阅读,更多相关《数据结构-图习题(15页珍藏版)》请在金锄头文库上搜索。

1、第8章 图第8章 图8-1 画出1个顶点、2个顶点、3个顶点、4个顶点和5个顶点的无向完全图。试证明在n个顶点的无向完全图中,边的条数为n(n-1)/2。【解答】2个顶点的无向完全图1个顶点的无向完全图5个顶点的无向完全图4个顶点的无向完全图3个顶点的无向完全图【证明】在有n个顶点的无向完全图中,每一个顶点都有一条边与其它某一顶点相连,所以每一个顶点有n-1条边与其他n-1个顶点相连,总计n个顶点有n(n-1)条边。但在无向图中,顶点i到顶点j与顶点j到顶点i是同一条边,所以总共有n(n-1)/2条边。DA8-2 右边的有向图是强连通的吗?请列出所有的简单路径。EB【解答】FC判断一个有向图是

2、否强连通,要看从任一顶点出发是否能够回到该顶点。右面的有向图做不到这一点,它不是强连通的有向图。各个顶点自成强连通分量。所谓简单路径是指该路径上没有重复的顶点。从顶点A出发,到其他的各个顶点的简单路径有AB,ADB,ABC,ADBC,AD,ABE,ADE,ADBE,ABCFE,ADBCFE,ABCF,ADBCF。从顶点B出发,到其他各个顶点的简单路径有BC,BCF,BE,BCFE。从顶点C出发,到其他各个顶点的简单路径有CF,CFE。从顶点D出发,到其他各个顶点的简单路径有DB,DBC,DBCF,DE,DBE,DBCFE。从顶点E出发,到其他各个顶点的简单路径无。从顶点F出发,到其他各个顶点的

3、简单路径有FE。8-3 给出右图的邻接矩阵、邻接表和邻接多重表表示。DA【解答】(1) 邻接矩阵EBFC310 A1 B2 C3 D4 E5 F(2) 邻接表42(出边表)54140 A1 B2 C3 D4 E5 F(入边表)30105312data fin fout(3) 邻接多重表(十字链表)i j ilink jlink0 1 (A, B)0 A1 B2 C3 D4 E5 F0 3 (A, D)1 2 (B, C)1 4 (B, E)2 5 (C, F)3 1 (D, B)3 4 (D, E)5 4 (F, E)8-4 用邻接矩阵表示图时,若图中有1000个顶点,1000条边,则形成的邻

4、接矩阵有多少矩阵元素?有多少非零元素?是否稀疏矩阵?【解答】一个图中有1000个顶点,其邻接矩阵中的矩阵元素有10002 = 1000000个。它有1000个非零元素(对于有向图)或2000个非零元素(对于无向图),因此是稀疏矩阵。8-5 用邻接矩阵表示图时,矩阵元素的个数与顶点个数是否相关?与边的条数是否相关?【解答】用邻接矩阵表示图,矩阵元素的个数是顶点个数的平方,与边的条数无关。矩阵中非零元素的个数与边的条数有关。8-6 有n个顶点的无向连通图至少有多少条边?有n个顶点的有向强连通图至少有多少条边?试举例说明。【解答】n个顶点的无向连通图至少有n-1条边,n个顶点的有向强连通图至少有n条

5、边。例如:特例情况是当n = 1时,此时至少有0条边。8-7对于有n个顶点的无向图,采用邻接矩阵表示,如何判断以下问题: 图中有多少条边?任意两个顶点i和j之间是否有边相连?任意一个顶点的度是多少?【解答】用邻接矩阵表示无向图时,因为是对称矩阵,对矩阵的上三角部分或下三角部分检测一遍,统计其中的非零元素个数,就是图中的边数。如果邻接矩阵中Aij 不为零,说明顶点i与顶点j之间有边相连。此外统计矩阵第i行或第i列的非零元素个数,就可得到顶点i的度数。8-8对于如右图所示的有向图,试写出:(1) 从顶点出发进行深度优先搜索所得到的深度优先生成树;(2) 从顶点出发进行广度优先搜索所得到的广度优先生

6、成树; 【解答】(1) 以顶点为根的深度优先生成树(不唯一): 或 (2) 以顶点为根的广度优先生成树:8-9 试扩充深度优先搜索算法,在遍历图的过程中建立生成森林的左子女-右兄弟链表。算法的首部为void Graph:DFS ( const int v, int visited , TreeNode * t ) 其中,指针t指向生成森林上具有图顶点v信息的根结点。(提示:在继续按深度方向从根v的某一未访问过的邻接顶点w向下遍历之前,建立子女结点。但需要判断是作为根的第一个子女还是作为其子女的右兄弟链入生成树。)【解答】为建立生成森林,需要先给出建立生成树的算法,然后再在遍历图的过程中,通过一

7、次次地调用这个算法,以建立生成森林。te mplate void Graph : DFS_Tree ( const int v, int visited , TreeNode *t ) /从图的顶点v出发, 深度优先遍历图, 建立以t (已在上层算法中建立)为根的生成树。 Visitedv = 1; int first = 1; TreeNode * p, * q; int w = GetFirstNeighbor ( v ); /取第一个邻接顶点 while ( w != -1 ) /若邻接顶点存在 if ( vositedw = 0 ) /且该邻接结点未访问过 p = new TreeNo

8、de ( GetValue (w) );/建立新的生成树结点 if ( first = 1 )/若根*t还未链入任一子女 t-setFirstChild ( p ); first = 0; /新结点*p成为根*t的第一个子女 else q-setNextSibling ( p );/否则新结点*p成为*q的下一个兄弟 q = p;/指针q总指示兄弟链最后一个结点 DFS_Tree ( w, visited, q );/从*q向下建立子树 w = GetNextNeighbor ( v, w );/取顶点v排在邻接顶点w的下一个邻接顶点 下一个算法用于建立以左子女-右兄弟链表为存储表示的生成森林

9、。template void Graph : DFS_Forest ( Tree & T ) /从图的顶点v出发, 深度优先遍历图, 建立以左子女-右兄弟链表表示的生成森林T。 T.root = NULL; int n = NumberOfVertices ( );/顶点个数 TreeNode * p, * q; int * visited = new int n ;/建立访问标记数组 for ( int v = 0; v n; v+ ) visitedv = 0; for ( v = 0; v n; v+ ) /逐个顶点检测 if ( visitedv = 0 ) /若尚未访问过 p = n

10、ew TreeNode ( GetValue ( v ) );/建立新结点*p if ( T.root = NULL ) T.root = p;/原来是空的生成森林, 新结点成为根 else q- setNextSibling ( p );/否则新结点*p成为*q的下一个兄弟 q = p; DFS_Tree ( v, visited, p );/建立以*p为根的生成树 8-10 用邻接表表示图时,顶点个数设为n,边的条数设为e,在邻接表上执行有关图的遍历操作时,时间代价是O(n*e)?还是O(n+e)?或者是O(max(n,e)?【解答】在邻接表上执行图的遍历操作时,需要对邻接表中所有的边链表

11、中的结点访问一次,还需要对所有的顶点访问一次,所以时间代价是O(n+e)。8-11 右图是一个连通图,请画出 (1) 以顶点为根的深度优先生成树;(2) 如果有关节点,请找出所有的关节点。(3) 如果想把该连通图变成重连通图,至少在图中加几条边?如何加?【解答】(1) 以顶点为根的深度优先生成树:(2) 关节点为 ,(3) 至少加四条边 (1, 10), (3, 4), (4, 5), (5, 6)。从的子孙结点到的祖先结点引一条边,从的子孙结点到根的另一分支引一条边,并将的子孙结点、与结点连结起来,可使其变为重连通图。8-12试证明在一个有n个顶点的完全图中,生成树的数目至少有2n-1-1。【证明】略71110758698-13 编写一个完整的程序,首先定义堆和并查集的结构类型和相关操作,再定义Kruskal求连通网络的最小生成树算法的实现。并以右图为例,写出求解过程中堆、并查集和最小生成树的变化。【解答】求解过程的第一步是对所有的边,按其权值大小建堆:3 4 51 2 71 2 71 2 72 3 102 3 102 4 92 3 101 3 111 3 11加(1, 2), (1, 3), (2,3)2 4 91 3 11加(3, 4)加(2, 4)3 4 53 4 53 5 71 2 71 2 73 5 73 6 82 3 102 4 91 3 111 3 112 3 1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号