- 1、本文档共88页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章 图 图的抽象数据类型 7.1 图的基本术语 例:判断下列4种图形各属什么类型? 证明: 稀疏图:稠密图: 带权图: 邻接点: 简单路径: 7.2 图的存储结构 图的特点: 1. 邻接矩阵(数组)表示法 图的邻接矩阵在机内如何表示? (参见教材P161) 例2 :有向图的邻接矩阵如何表示? 2. 邻接表(链式)表示法 图的邻接表在机内如何表示? (参见教材P163) 例1:无向图的邻接表如何表示? 例3:已知某网的邻接(出边)表,请画出该网络。 讨论:邻接表与邻接矩阵有什么异同之处? 3. 十字链表表示法 十字链表存储结构描述: 例:画出有向图的十字链表。 4. 邻接多重表表示法 例:画出无向图的邻接多重表 7.3 图的遍历 一、深度优先搜索( DFS ) 深度优先搜索(遍历)步骤: 讨论1:计算机如何实现DFS? 讨论2: DFS算法如何编程? 讨论3:在图的邻接表中如何进行DFS? 讨论4: 邻接表的DFS算法如何编程? DFS 算法效率分析: 二、广度优先搜索( BFS ) 广度优先搜索(遍历)步骤: 讨论1:计算机如何实现BFS? 讨论2: BFS算法如何编程? BFS 算法效率分析: 7.4 图的连通性问题 1.求图的生成树(或生成森林) 例1 :画出下图的生成树 例2:画出下图的生成森林(或极小连通子图) 2. 求最小生成树 典型用途: 讨论:如何求得最小生成树? 0 0 0 0 0 0 6 0 0 0 0 0 0 5 0 0 0 0 0 0 4 0 0 0 0 0 0 3 0 0 0 0 0 0 2 0 0 0 0 0 0 1 6 5 4 3 2 1 0 0 0 0 0 0 6 5 4 3 2 1 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 DFS 结果 邻接矩阵 A 辅助数组 visited [n ] 起点 ——开辅助数组 visited [n ]! 例: 0 0 1 0 0 0 6 0 0 0 1 1 0 5 1 0 0 0 0 1 4 0 1 0 0 0 1 3 0 1 0 0 0 1 2 0 0 1 1 1 0 1 6 5 4 3 2 1 v2 → → → → → v1 v3 v5 v4 v6 请注意逐级回退是递归概念 for( j=1; j=n; j++) if ( A[v, j] ! visited[j] ) DFS1(A, n, j); return; } // DFS1 DFS1(A, n, v) { visit(v); visited[v]=1; ——可以用递归算法! //A[n][n]为邻接矩阵,v为起始顶点(编号) //访问(例如打印)顶点v A[v,j] =1 有邻接点 visited [n ]=0 未访问过 //访问后立即修改辅助数组标志 //从v所在行从头搜索邻接点 (教材上DFS递归算法见P169) DFS 结果 0 0 0 0 3 2 1 0 辅助数组 visited [n ] 0 0 0 1 0 0 1 1 0 1 1 1 1 1 1 1 例: —照样借用visited [n ]! 起点 0 1 2 3 注意:在邻接表中,并非每个链表元素(表结点)都被扫描到,因此遍历速度很快。 v0 → → → v1 v2 v3 (书上没有,03级同学编,仅供参考) //访问后立即修改辅助数组标志 ——仍用递归算法 Int visited[]; //初始化辅助数组,元素均为0 Void DFS(List,v,p) //设p为v的头指针 { visit(v); //访问起点 visited[v]=1; //起点已访问,0变1 while(p-link) //当存在起点的第一个邻接点时 { p=p-link; v=p-data; if(!visited[v])DFS(List,v,p); //进行递归 } return; } (设图中有 n 个顶点,e 条边) 如果用邻接矩阵来表示图,遍历图中每一个顶点都要从头扫描该顶点所在行,因此遍历全部顶点所需的时间为O(n2)。 如果用邻接表来表示图,虽然有 2e 个表结点,但只需扫描 e 个结点即可完成遍历,加上访问 n个头结点的时间,因此遍历图的时间复杂度为O(n+e)。 结 论: 稠密图适于在邻接矩阵上进行深度遍历; 稀疏图适于在邻接表上进行深度遍历。 基本思想:——仿树的层次遍历过程。 Breadth_First Search v1 v1 v2 v3 v8 v7 v6 v4 v5 BFS 结果 例1: → → → → v2 v3 →
您可能关注的文档
最近下载
- 中国高尔夫差点系统会员入会申请书.doc
- 江苏国泰(002091)公司2023年财务分析研究报告.doc
- 2024执业药师继续教育药物分析(3)参考答案.docx
- DB11T 383-2023 建筑工程施工现场安全资料管理规程.docx
- 总体国家安全观授课.pptx VIP
- 一种聚4-甲基-1-戊烯中空纤维膜的制备方法.pdf VIP
- DB11T 1832.2-2023 建筑工程施工工艺规程 第2部分:防水工程.docx
- 普外科麻醉科运用PDCA循环提高患者术后自控镇痛有效率QCC品管圈成果汇报书.docx
- 海信BCD-203FH电冰箱使用说明书.pdf
- 哈工大尹海洁社会统计学(第2版)课后习题答案.docx
文档评论(0)