收藏 分享(赏)

数据结构第八章作业提示.doc

上传人:hskm5268 文档编号:6359133 上传时间:2019-04-09 格式:DOC 页数:16 大小:304.50KB
下载 相关 举报
数据结构第八章作业提示.doc_第1页
第1页 / 共16页
数据结构第八章作业提示.doc_第2页
第2页 / 共16页
数据结构第八章作业提示.doc_第3页
第3页 / 共16页
数据结构第八章作业提示.doc_第4页
第4页 / 共16页
数据结构第八章作业提示.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

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

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

3、他各个顶点的简单路径无。从顶点 F 出发,到其他各个顶点的简单路径有 FE。8-3 给出右图的邻接矩阵、邻接表和邻接多重表表示。【解答】(1) 邻接矩阵1 个顶点的无向完全图2 个顶点的无向完全图 3 个顶点的无向完全图4 个顶点的无向完全图 5 个顶点的无向完全图ABCDEFABCDEF第 8 章 图97(2) 邻接表(3) 邻接多重表(十字链表)8-4 用邻接矩阵表示图时,若图中有 1000 个顶点,1000 条边,则形成的邻接矩阵有多少矩阵元素?有多少非零元素?是否稀疏矩阵?【解答】一个图中有 1000 个顶点,其邻接矩阵中的矩阵元素有 10002 = 1000000 个。它有 1000

4、 个非零元素(对于有向图)或 2000 个非零元素(对于无向图) ,因此是稀疏矩阵。8-5 用邻接矩阵表示图时,矩阵元素的个数与顶点个数是否相关?与边的条数是否相关?【解答】用邻接矩阵表示图,矩阵元素的个数是顶点个数的平方,与边的条数无关。矩阵中非零元素的个数与边的条数有关。8-6 有 n 个顶点的无向连通图至少有多少条边?有 n 个顶点的有向强连通图至少有多少条边?试举例说明。【解答】0 A1 B2 C3 D4 E5 F10 A1 B2 C3 D4 E5 F32 451 440 3101 3 52(出边表)(入边表)0 A1 B2 C3 D4 E5 Fdata fin fout i j il

5、ink jlink0 1 (A, B)0 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 章 图98 或 n 个顶点的无向连通图至少有 n-1 条边,n 个顶点的有向强连通图至少有 n 条边。例如:特例情况是当 n = 1 时,此时至少有 0 条边。8-7 对于有 n 个顶点的无向图,采用邻接矩阵表示,如何判断以下问题: 图中有多少条边?任意两个顶点 i 和 j 之间是否有边相连?任意一个顶点的度是多少?【解答】用邻接矩阵表示无向图时,因为是对称矩阵,对矩阵的上三角部分或下三角部分检测一遍,统计其中

6、的非零元素个数,就是图中的边数。如果邻接矩阵中 Aij 不为零,说明顶点 i 与顶点 j 之间有边相连。此外统计矩阵第 i 行或第 i 列的非零元素个数,就可得到顶点 i 的度数。8-8 对于如右图所示的有向图,试写出:(1) 从顶点出发进行深度优先搜索所得到的深度优先生成树;(2) 从顶点出发进行广度优先搜索所得到的广度优先生成树; 【解答】(1) 以顶点为根的深度优先生成树(不唯一): (2) 以顶点为根的广度优先生成树:8-9 试扩充深度优先搜索算法,在遍历图的过程中建立生成森林的左子女-右兄弟链表。算法的首部为void Graph:DFS ( const int v, int visi

7、ted , TreeNode * t ) 其中,指针 t 指向生成森林上具有图顶点 v 信息的根结点。 (提示:在继续按深度方向从根 v 的某一未访问过的邻接顶点 w 向下遍历之前,建立子女结点。但需要判断是作为根的第一个子女还是作为其子女的右兄弟链入生成树。 )【解答】为建立生成森林,需要先给出建立生成树的算法,然后再在遍历图的过程中,通过一次次地调用这个算法,以建立生成森林。te mplate void Graph : DFS_Tree ( const int v, int visited , TreeNode *t ) /从图的顶点 v 出发, 深度优先遍历图, 建立以 t (已在上层算

8、法中建立)为根的生成树。Visitedv = 1; int first = 1; TreeNode * p, * q;int w = GetFirstNeighbor ( v ); /取第一个邻接顶点while ( w != -1 ) /若邻接顶点存在if ( vositedw = 0 ) /且该邻接结点未访问过p = new TreeNode ( GetValue (w) ); /建立新的生成树结点第 8 章 图99if ( first = 1 ) /若根*t 还未链入任一子女 t-setFirstChild ( p ); first = 0; /新结点*p 成为根*t 的第一个子女else

9、 q-setNextSibling ( p ); /否则新结点*p 成为*q 的下一个兄弟q = p; /指针 q 总指示兄弟链最后一个结点DFS_Tree ( w, visited, q ); /从*q 向下建立子树w = GetNextNeighbor ( v, w ); /取顶点 v 排在邻接顶点 w 的下一个邻接顶点下一个算法用于建立以左子女-右兄弟链表为存储表示的生成森林。template void Graph : DFS_Forest ( Tree int n = NumberOfVertices ( ); /顶点个数TreeNode * p, * q;int * visited

10、= new int n ; /建立访问标记数组for ( int v = 0; v ( GetValue ( v ) ); /建立新结点*pif ( 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

11、(n,e)?【解答】在邻接表上执行图的遍历操作时,需要对邻接表中所有的边链表中的结点访问一次,还需要对所有的顶点访问一次,所以时间代价是 O(n+e)。8-11 右图是一个连通图,请画出 (1) 以顶点为根的深度优先生成树;(2) 如果有关节点,请找出所有的关节点。(3) 如果想把该连通图变成重连通图,至少在图中加几条边?如何加?【解答】(1) 以顶点为根的深度优先生成树: 第 8 章 图100(2) 关节点为 ,(3) 至少加四条边 (1, 10), (3, 4), (4, 5), (5, 6)。从的子孙结点 到的祖先结点引一条边,从的子孙结点到根的另一分支引一条边,并将的子孙结点、与结点连

12、结起来,可使其变为重连通图。8-12 试证明在一个有 n 个顶点的完全图中,生成树的数目至少有 2n-1-1。【证明】略8-13 编写一个完整的程序,首先定义堆和并查集的结构类型和相关操作,再定义 Kruskal 求连通网络的最小生成树算法的实现。并以右图为例,写出求解过程中堆、并查集和最小生成树的变化。【解答】求解过程的第一步是对所有的边,按其权值大小建堆:1 3 1111 76851097 1 2 71 3 11 2 3 101 2 72 4 9 2 3 101 3 113 4 51 2 7 2 3 102 4 9加(1, 2), (1, 3), (2,3)加(2, 4) 加(3, 4)1

13、 3 113 4 51 2 7 3 5 72 4 9 2 3 10 1 3 113 4 51 2 7 3 5 72 4 9 2 3 10 3 6 8加(3, 5) 加(3, 6)1 2 73 4 55 6 6 3 5 72 4 9 2 3 10 3 6 81 3 11加(5, 6)第 8 章 图101求解过程中并查集与堆的变化:最后得到的生成树如下完整的程序如下:#include template class MinHeap public:enum MaxHeapSize = 50 ;MinHeap ( int Maxsize = MaxHeapSize );MinHeap ( Type Ar

14、ray , int n );void Insert ( const Type void RemoveMin ( Type void Output ();private:void FilterDown ( int start, int end );void FilterUp ( int end );Type *pHeap;int HMaxSize;int CurrentSize;class UFSets public:3 1 -6 3 3 5 1 3 113 5 72 4 92 3 103 6 8675791 3 115 6 61 2 7 3 5 72 4 9 2 3 10 3 6 8选(3,4

15、,5)选(5,6,6) 1 3 111 2 73 5 72 4 9 2 3 103 6 8选(1,2,7) 选(3,5,7)1 3 112 4 9 2 3 103 6 8 选(3,6,8), 在同一连通分量上, 不加 1 3 11 2 3 102 4 9 选(2,4,9), 结束1 3 112 3 100 1 2 3 4 5 6并查集的存储表示第 8 章 图102enum MaxUnionSize = 50 ;UFSets ( int MaxSize = MaxUnionSize );UFSets () delete m_pParent; void Union ( int Root1, int

16、 Root2 );int Find ( int x );private:int m_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;i

17、nt CurrentVertices;class GraphEdge public:int head, tail;int cost;int operator cost = 0 ) x = m_pParentx;return x;template MinHeap : MinHeap ( int Maxsize ) HMaxSize = Maxsize; pHeap = new TypeHMaxSize;CurrentSize = -1;template MinHeap : MinHeap ( Type Array, int n ) HMaxSize = ( n = 0 ) FilterDown

18、( iPos, CurrentSize );iPos-;template void MinHeap : FilterDown ( int start, int end ) int i = start, j = 2 * start + 1;Type Temp = pHeapi;while ( j void MinHeap : FilterUp ( int end ) int i = end, j = ( end - 1 ) / 2;Type Temp = pHeapi;while ( i 0 ) if ( pHeapj void MinHeap : Insert ( const Type if

19、( CurrentSize = HMaxSize ) return;pHeapCurrentSize = ele;FilterUp ( CurrentSize );template void MinHeap : RemoveMin ( Type i heap ( VerticesNum *VerticesNum );UFSets set ( VerticesNum );for ( i = 0; i 0 ) e.head = i; e.tail = j; e.cost = Edgeij;heap.Insert ( e );count = 1;while ( count = 0 ) p = dis

20、Jointp;while ( disJointq = 0 ) p = disJointq;if ( p != q ) disJointj = i; / i 与 j 不在同一连通分量上, 连通之 else / i 与 j 在同一连通分量上p = i; /寻找离结点 i 与 j 最近的祖先结点while ( disJointp = 0 ) /每变动一个 p, 就对 q 到根的路径检测一遍q = j;while ( disJointq = 0 if ( disJointq = disJointp ) break;else p = disJointp;k = disJointp; /结点 k 是 i

21、和 j 的最近的共同祖先p = i; q = disJointp; max = -MaxNum; /从 i 到 k 找权值最大的边(s1, s2)while ( q max ) max = Edgeqp; s1 = p; s2 = q; p =q; q = disJointp; 14165611第 8 章 图107p = j; q = disJointp; max = -MaxNum; /从 j 到 k 找权值最大的边(t1, t2)while ( q max ) max = Edgeqp; t1 = p; t2 = q; p =q; q = disJointp;max = Edgeij; k

22、1 = i; k2 = j;if ( max = 0 /未选定最短路径顶点链表第 8 章 图109 int i, k, u; ListNode * p;T. MakeEmpty ();for ( i = 1; i vertex.len = p-length; p = p-link; while (1) T.First (); /循环检测链表 Tif ( ! T.NextNotNull( ) ) break; /链表仅剩一个顶点, 跳出循环, 算法结束float min = MaxNum; u = 0;while ( T.NotNull( ) ) /链表不空, 还有剩余顶点未确定最短路径i =

23、T.GetData( ); /取剩余顶点号if ( Si.len vertex; /顶点 k 在链表 T 中表示该顶点未最终选定最短路径if ( T.Find(k) != NULL Sk.pre = u; /修改p = p-link;T.Find(u); T.Remove(); /在链表 T 中删除顶点 u 8-17 试证明:对于一个无向图 G = (V, E),若 G 中各顶点的度均大于或等于 2,则 G 中必有回路。【解答】反证法:对于一个无向图 G=(V,E) ,若 G 中各顶点的度均大于或等于 2,则 G 中没有回路。此时从某一个顶点出发,应能按拓扑有序的顺序遍历图中所有顶点。但当遍历

24、到该顶点的另一邻接顶点时,又可能回到该顶点,没有回路的假设不成立。8-18 设有一个有向图存储在邻接表中。试设计一个算法,按深度优先搜索策略对其进行拓扑排序。并以右图为例检验你的算法的正确性。【解答】(1) 利用题 8-16 定义的邻接表结构。增加两个辅助数组和一个工作变量: 记录各顶点入度 int indegreeNumVertices。 记录各顶点访问顺序 int visitedNumVertices,初始时让 visitedi = 0, i = 1, 2, , NumVertices。 访问计数 int count,初始时为 0。(2) 拓扑排序算法第 8 章 图110void Grap

25、h : dfs ( int visited , int indegree , int v, int visitedv = count;cout vertex;indegreew-;if ( visitedw = 0 p = p-link;主程序int i, j; Edge *p; float w;cin NumVertices;int * visited = new intNumVertices+1;int * indegree = new intNumVertices+1;for ( i = 1; i NodeTablei.data; cout i j w; cout link = Node

26、Tablei.adj; NodeTablei.adj = p;NumEdges+;cin i j w; cout e 0 0 15 19 19 15 29 38l 17 0 15 27 19 27 37 38l-e 17 0 0 8 0 12 8 0此工程最早完成时间为 43。关键路径为8-20 若 AOE 网络的每一项活动都是关键活动。令 G 是将该网络的边去掉方向和权后得到的无向图。 (1) 如果图中有一条边处于从开始顶点到完成顶点的每一条路径上,则仅加速该边表示的活动就能减少整个工程的工期。这样的边称为桥(bridge)。证明若从连通图中删去桥,将把图分割成两个连通分量。(2) 编写一个时间复杂度为 O(n+e)的使用邻接表表示的算法,判断连通图 G 中是否有桥,若有。输出这样的桥。【解答】(1) 反证法(略)(2) 借助于求重连通分量的算法。如果一条边的两个端点满足下列条件之一,即为桥: 两个端点都是关节点; 一个端点是关节点,另一端点是整个图的开始点; 一个端点是关节点,另一端点是整个图的完成点。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报