ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:38.91KB ,
资源ID:6308562      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6308562.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构图习题.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构图习题.docx

1、数据结构图习题第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) 邻接矩阵EBFC(2) 311 A2 B3 C4 D5 E6 F邻接表42(出边表)54141 A2 B3 C4 D5 E6 F(入边表)30105312data fin fout (3) 邻接多重表(十字链表)i j ilink jlink0 1 (A, B)1 A2 B3 C4 D5 E6 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个顶点的有向强连通

5、图至少有n条边。例如: 特例情况是当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

8、 = new TreeNode ( 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 ( visite

10、dv = 0 ) /若尚未访问过 p = new 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试证明在

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

13、82 3 102 4 91 3 111 3 112 3 102 4 9加(3, 5)加(3, 6)3 4 53 5 75 6 6加(5, 6)3 6 82 3 102 4 91 2 71 3 11 求解过程中并查集与堆的变化:1 2 75 6 63 6 83 5 73 5 71 2 72 3 102 4 91 3 11选(5,6,6)3 6 82 3 102 4 91 3 11选(3,4,5)3 6 83 5 72 3 103 6 82 4 92 3 101 3 11选(3,5,7)2 4 91 3 11选(1,2,7)2 3 102 4 91 3 112 3 101 3 11选(2,4,9)

14、, 结束选(3,6,8), 在同一连通分量上, 不加 最后得到的生成树如下0 1 2 3 4 5 63 1 -6 3 3 5 7567并查集的存储表示9完整的程序如下:#include template class MinHeap public: enum MaxHeapSize = 50 ; MinHeap ( int Maxsize = MaxHeapSize ); MinHeap ( Type Array , int n ); void Insert ( const Type &ele ); void RemoveMin ( Type &Min ); void Output (); pr

15、ivate: void FilterDown ( int start, int end ); void FilterUp ( int end ); Type *pHeap; int HMaxSize; int CurrentSize;class UFSets public: enum MaxUnionSize = 50 ; UFSets ( int MaxSize = MaxUnionSize ); UFSets () delete m_pParent; void Union ( int Root1, int Root2 ); int Find ( int x );private: int m

16、_iSize; int *m_pParent;class Graph public: enum MaxVerticesNum = 50 ; Graph( int Vertices = 0) CurrentVertices = Vertices; InitGraph(); void InitGraph (); void Kruskal (); int GetVerticesNum () return CurrentVertices; private: int EdgeMaxVerticesNumMaxVerticesNum; int CurrentVertices;class GraphEdge

17、 public: int head, tail; int cost; int operator = ( GraphEdge &ed );GraphEdge : operator cost = ed.cost;UFSets : UFSets ( int MaxSize ) m_iSize = MaxSize; m_pParent = new intm_iSize; for ( int i = 0; i = 0 ) x = m_pParentx; return x;template MinHeap : MinHeap ( int Maxsize ) HMaxSize = Maxsize; pHea

18、p = new TypeHMaxSize; CurrentSize = -1;template MinHeap : MinHeap ( Type Array, int n ) HMaxSize = ( n MaxHeapSize ) ? MaxHeapSize : n; pHeap = new TypeHMaxSize; for ( int i = 0; i = 0 ) FilterDown ( iPos, CurrentSize ); iPos-; template void MinHeap : FilterDown ( int start, int end ) int i = start,

19、 j = 2 * start + 1; Type Temp = pHeapi; while ( j = end ) if ( j end & pHeapj+1 = pHeapj ) j+; if ( Temp = pHeapj ) break; pHeapi = pHeapj; i = j; j = 2 * j + 1; pHeapi = Temp;template void MinHeap : FilterUp ( int end ) int i = end, j = ( end - 1 ) / 2; Type Temp = pHeapi; while ( i 0 ) if ( pHeapj

20、 = Temp ) break; pHeapi = pHeapj; i = j; j = ( j - 1 ) / 2; pHeapi = Temp;template void MinHeap : Insert ( const Type &ele ) CurrentSize+; if ( CurrentSize = HMaxSize ) return; pHeapCurrentSize = ele; FilterUp ( CurrentSize );template void MinHeap : RemoveMin ( Type &Min ) if ( CurrentSize 0 ) retur

21、n; Min = pHeap0; pHeap0 = pHeapCurrentSize-; FilterDown ( 0, CurrentSize );template void MinHeap : Output ( ) for ( int i = 0; i = CurrentSize; i+ ) cout pHeapi ; cout endl;void Graph : InitGraph( ) Edge00 = -1; Edge01 = 28; Edge02 = -1; Edge03 = -1; Edge04 = -1; Edge05 = 10; Edge06 = -1; Edge11 = -

22、1; Edge12 = 16; Edge13 = -1; Edge14 = -1; Edge15 = -1; Edge16 = 14; Edge22 = -1; Edge23 = 12; Edge24 = -1; Edge25 = -1; Edge26 = -1; Edge33 = -1; Edge34 = 22; Edge35 = -1; Edge36 = 18; Edge44 = -1; Edge45 = 25; Edge46 = 24; Edge55 = -1; Edge56 = -1; Edge66 = -1; for ( int i = 1; i 6; i+ ) for ( int

23、j = 0; j i; j + ) Edgeij = Edgeji;void Graph : Kruskal( ) GraphEdge e; int VerticesNum = GetVerticesNum ( ); int i, j, count; MinHeap heap ( VerticesNum *VerticesNum ); UFSets set ( VerticesNum ); for ( i = 0; i VerticesNum; i+ ) for ( j = i + 1; j 0 ) e.head = i; e.tail = j; e.cost = Edgeij; heap.I

24、nsert ( e ); count = 1; while ( count VerticesNum ) heap.RemoveMin ( e ); i = set.Find ( e.head ); j = set.Find ( e.tail ); if ( i != j ) set.Union ( i, j ); count+; cout ( e.head , e.tail , e.cost ) endl; 8-14 利用Dijkstra算法的思想,设计一个求最小生成树的算法。【解答】 计算连通网络的最小生成树的Dijkstra算法可描述如下:将连通网络中所有的边以方便的次序逐步加入到初始为空的生成树的边集合T中。每次选择并加入一条边时,需要判断它是否会与先前加入T的边构成回路。如果构成了回路,则从这个回路中将权值最大的边退选。 下面以邻接矩阵作为连通网络的存储表示,并以并查集作为判断是否出现回路的工具,分析算法的执行过程。165192192614611181616 215211419149并查集, 表明4个结点在同一连通分量上1616 5195 19149

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1