湘潭大学数据结构课件Ch09Graph讲义.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《湘潭大学数据结构课件Ch09Graph讲义.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 湘潭 大学 数据结构 课件 Ch09Graph 讲义
- 资源描述:
-
1、第9章 图论算法p介绍几个现实生活中发生的问题,可以转化成图论算法;p解决几个普通的图论问题的算法;p深度优先搜索(depth-first search)技巧;p【例例】图中村与村之间的道路是一个较长远的规划目标。图中村与村之间的道路是一个较长远的规划目标。0 引子引子最小生成树问题最小生成树问题9.5节讨论节讨论问题问题1 公路村村通公路村村通项目要求用最小的投入实现每个村都能够有公路通项目要求用最小的投入实现每个村都能够有公路通达。那么应该选择建设哪些道路可以使这个达。那么应该选择建设哪些道路可以使这个投资最小投资最小呢?(假设每条呢?(假设每条道路的建设成本已知)道路的建设成本已知)【例
2、例】下下图为公路规划抽象及造价预算示例图。图为公路规划抽象及造价预算示例图。0 引子引子问题问题2 在同样的抽象图中,假设把在同样的抽象图中,假设把“造价造价”的含义修改成的含义修改成“距离距离”,那么我们就可以问:那么我们就可以问:要走遍每个村庄,并回到起点,该如何走才能够要走遍每个村庄,并回到起点,该如何走才能够使得总的路程最短?使得总的路程最短?88756655444532745BCDFLHWXYZ巡回售货员问题巡回售货员问题(TSP)P.253讨论讨论 通常:用通常:用|V|表示顶点的数量(表示顶点的数量(|V|1),),用用|E|表示边的数量(表示边的数量(|E|0)。)。例例 上上
3、图给出了一个图的示例,在该图中:图给出了一个图的示例,在该图中:集合集合V ,|V|=;集合集合E|E|=“图图”G可以表示为集合:可以表示为集合:G=(V,E)。每条边是。每条边是一个顶点对一个顶点对(v,w)E,并且并且 v,w V。图图的定义的定义88756655444532745BCDFLHWXYZ1 若干定义若干定义 B,C,D,F,H,L,W,X,Y,Z 10(Z,B),(Z,W),(B,W),(B,L),(B,D),(D,L),(W,X),(W,L),(L,H),(L,F),(X,H),(X,Y),(H,Y),(H,F),(H,C),(F,C),(Y,C)17。(1)无向图无向图
4、(Undirected Graphs):边(边(v,w)等同于边()等同于边(w,v)。用圆括号)。用圆括号“()()”表示无向边。表示无向边。(a)无向图G1 1230G1=(V1,E1),V1=0,1,2,3,E1=(0,1),(0,2),(0,3),(2,3)。1 若干定义若干定义 (b)有向图G2 12304(2)有向图有向图(Directed Graphs):边边不同于边不同于边。用尖括号用尖括号“”表示有向边;有向边也称表示有向边;有向边也称“弧(弧(Arc)”。G2=(V2,E2),V2=0,1,2,3,4,E2=,,。1 若干定义若干定义(3)简单图简单图(Simple Gra
5、phs):没有重边和自回路的图没有重边和自回路的图。1201230(a)重边图 (b)自回路图 本书只讨论简单图本书只讨论简单图。1 若干定义若干定义(5)路径、简单路径、回路、无环图路径、简单路径、回路、无环图(4)邻接点邻接点:如果(如果(v,w)或)或 是图中任意一条边,是图中任意一条边,那么称那么称v和和w互为互为“邻接点(邻接点(Adjacent Vertices)”。图图G中从中从vp 到到 vq 的的路径路径:=vp,vi1,vi2,vin,vq 使得使得(vp,vi1),(vi1,vi2),(vin,vq)或或,都属于都属于E(G)路径长度路径长度:=路径中边的数量路径中边的数
6、量 简单路径简单路径:=vi1,vi2,vin 都是不同顶点都是不同顶点 回路回路:=起点和终点相同(起点和终点相同(vp=vq)的路径)的路径 无环图无环图:=不存在任何回路的图不存在任何回路的图 有向无环图有向无环图:=不存在回路的有向图,也称不存在回路的有向图,也称DAG(Directed Acyclic Graph)1 若干定义若干定义(7)有有向完全图向完全图:在顶点数给定为:在顶点数给定为n的情况下,有向边数达的情况下,有向边数达到最大的到最大的n(n-1)条边。条边。(6)无向完全图无向完全图:在顶点数给定为:在顶点数给定为n的情况下,边数达到最大的情况下,边数达到最大的的n(n
7、-1)/2条边。(因为没有重边和自回路边)条边。(因为没有重边和自回路边)02132)1(2|E|V|nnnCn0213)1(|E|V|2nnPnn(8)顶点的顶点的度度(degree)、入度入度(in-degree)、出度出度(out-degree):度度(v):=与顶点与顶点v相关的边数相关的边数v入度入度(v)=3;出度出度(v)=1;度度(v)=4 给定给定 n 个顶点和个顶点和 e 条边的图条边的图G,则有则有:)(210iiniivdde度其中1 若干定义若干定义(10)权(权(Cost)、网络(、网络(Network)(9)稠密图、稀疏图稠密图、稀疏图:是否满足:是否满足|E|V
8、|log2|V|,作为稠密图,作为稠密图和稀疏图的分界条件。和稀疏图的分界条件。(12)无向图的顶点无向图的顶点连通、连通图、连通分量连通、连通图、连通分量:(11)图图G的的子图子图 G:V(G)V(G)&E(G)E(G)如果无向图从一个顶点如果无向图从一个顶点vi到另一个顶点到另一个顶点vj(ij)有路径,则称顶点有路径,则称顶点vi和和vj是是“连通连通的(的(Connected)”无向图中无向图中任意两顶点都是连通任意两顶点都是连通的,则称该图是的,则称该图是“连通图连通图(Connected Graph)”。无向图的无向图的极大连通子图极大连通子图称为称为“连通分量连通分量(Conn
9、ected Component)”。连通分量的概念包含以下连通分量的概念包含以下4个要点:个要点:子图、连通、子图、连通、极大顶点数、极大边数极大顶点数、极大边数1 若干定义若干定义(13)有向图的有向图的强连通图、连通分量强连通图、连通分量:有有向图中任意一对顶点向图中任意一对顶点vi 和和vj(ij)均既有从均既有从vi到到vj的路径,也有从的路径,也有从vj到到vi的的路径,则称该有向图是路径,则称该有向图是“强连通图强连通图(Strongly Connected Graph)”。有向图的有向图的极大强连通子图极大强连通子图称为称为“强连通分量强连通分量(Strongly Connect
10、ed Component)”。连通分量的概念也包含前面。连通分量的概念也包含前面4个要点。个要点。(14)树树、生成树、生成树:树是图的特例:无环的无树是图的特例:无环的无向图。向图。所谓连通图所谓连通图G的的“生成树生成树(Spanning Tree)”,是,是G的包含其全部的包含其全部n 个顶点的一个个顶点的一个极小连通子图极小连通子图。它必定包含且仅包含。它必定包含且仅包含G的的n-1条边。条边。生成树有可能生成树有可能不唯一不唯一。当且仅当当且仅当G满足下面满足下面4个条件之一(完全等价):个条件之一(完全等价):G有有n-1条边,且没有环;条边,且没有环;G有有n-1条边,且是连通的
11、;条边,且是连通的;G中的每一对顶点有且只有一条路径相连;中的每一对顶点有且只有一条路径相连;G是连通的,但删除任何一条边就会使它不连通。是连通的,但删除任何一条边就会使它不连通。1 若干定义若干定义类型名称:图类型名称:图(Graph)操作集:操作集:对于任意的图对于任意的图G Graph,顶点,顶点v、v1和和v2 ertex,以及任一访问顶点的函数以及任一访问顶点的函数visit(),操作举例:,操作举例:数据对象集:数据对象集:一非空的顶点集合一非空的顶点集合Vertex和一个边集合和一个边集合Edge,每条边用对应的一对顶点表示。每条边用对应的一对顶点表示。Graph Create(
12、):构造并返回一个空图;:构造并返回一个空图;void Destroy(Graph G):释放图:释放图G占用的存储空间;占用的存储空间;Graph InsertVertex(Graph G,Vertex v):返回一个在:返回一个在G中增加了新中增加了新顶点顶点v的图的图 Graph InsertEdge(Graph G,Vertex v1,Vertex v2):返回一个在:返回一个在G中中增加了新边增加了新边(v1,v2)的图;的图;Graph DeleteVertex(Graph G,Vertex v):删除:删除G中顶点中顶点v及其相关及其相关边,将结果图返回;边,将结果图返回;Gra
13、ph DFS(Graph G,Vertex v,visit()):在图:在图G中,从顶点中,从顶点v出发出发进行深度优先遍历;进行深度优先遍历;1 若干定义若干定义邻接矩阵邻接矩阵(Adjacency Matrix)边边的信息:用的信息:用邻接矩阵邻接矩阵A n n 表示为表示为:其他的边或如果 0,),(1A Gvvvvjijiji3V0V3V2V1 图的邻接矩阵表示示例图的邻接矩阵表示示例图的邻接矩阵表示示例图的邻接矩阵表示示例 图的表示图的表示顶点顶点信息:有信息:有n个顶点的图个顶点的图G(V,E)用一维数组用一维数组D n 表示;表示;1.1 图的表示图的表示邻接矩阵邻接矩阵 特点:
14、特点:无向图的邻接矩阵一定是一个无向图的邻接矩阵一定是一个对称矩阵对称矩阵。所需存储元。所需存储元素的个数是素的个数是|V|(|V|-1)/2。对于无向图,邻接矩阵的第对于无向图,邻接矩阵的第i行(或第行(或第i列)列)非非0元素元素(或非(或非元素)的个数正好是第元素)的个数正好是第i个顶点的度个顶点的度Degree(vi)。对于有向图,邻接矩阵的第对于有向图,邻接矩阵的第i行(或第行(或第i列)列)非非0元素元素的的个数正好是第个数正好是第i个顶点的个顶点的出度出度(vi)(或入度(或入度(vi))。)。存储空间代价为存储空间代价为(|V|2)。要确定图中有多少条边,所。要确定图中有多少条
15、边,所花费的花费的时间代价也是时间代价也是(|V|2)。对稀疏图来说,这样的对稀疏图来说,这样的代价明显是不合理的!代价明显是不合理的!1.1 图的表示图的表示邻接表邻接表(Adjacency List)对于图对于图G中的每个顶点中的每个顶点vi,将所有邻接于,将所有邻接于vi的顶点的顶点vj链成一链成一个单链表,这个单链表就称为顶点个单链表,这个单链表就称为顶点vi的邻接表,再将所有点的邻接表,再将所有点的邻接表表头放到一个数组中,就构成了图的的邻接表表头放到一个数组中,就构成了图的邻接表邻接表。无向图的邻接表表示示例无向图的邻接表表示示例VertexFirstEdge顶点域顶点域 边表头指
16、针边表头指针 AdjV Next邻接点域邻接点域 指针域指针域3V0V3V2V11.1 图的表示图的表示邻接表与逆邻接表邻接表与逆邻接表无向图无向图中有中有n 个顶点和个顶点和e条边,则它的邻接表需条边,则它的邻接表需n个头结点和个头结点和2e个表个表边结点。显然,在边边结点。显然,在边稀疏稀疏(e n(n-1)/2)的情况下,用的情况下,用邻接表表示邻接表表示图比邻接矩阵节省存储空间图比邻接矩阵节省存储空间;无向图的邻接表,顶点无向图的邻接表,顶点vi的度恰为第的度恰为第i个链表中的结点数;而在个链表中的结点数;而在有向有向图中图中,第,第i个链表中的结点个数只是顶点个链表中的结点个数只是顶
17、点vi的出度,为便于确定顶点的出度,为便于确定顶点vi的入度,可以建立一个有向图的的入度,可以建立一个有向图的逆邻接表逆邻接表,即对每个顶点,即对每个顶点vi 建立一个建立一个链接以链接以vi为头的弧的链表。为头的弧的链表。例如:例如:1.1 图的表示图的表示2 拓扑排序拓扑排序例例 获得一个计算机科学学位所需的课程。获得一个计算机科学学位所需的课程。Course numberCourse namePrerequisitesC1Programming INoneC2Discrete MathematicsNoneC3Data StructureC1,C2C4Calculus INoneC5Ca
18、lculus IIC4C6Linear AlgebraC5C7Analysis of AlgorithmsC3,C6C8Assembly LanguageC3C9Operating SystemsC7,C8C10Programming LanguagesC7C11Compiler DesignC10C12Artificial IntelligenceC7C13Computational TheoryC7C14Parallel AlgorithmsC13C15Numerical AnalysisC6怎么把这个表转换成图表示怎么把这个表转换成图表示?2 拓扑排序拓扑排序 AOV 网网:=图图 G
19、中中 V(G)表示活动(如:课程),表示活动(如:课程),E(G)表示优先关表示优先关系系(如如 表示表示 C1 是是 C3 的先修课程的先修课程)。C1C3 i 是是 j 的的 前驱前驱:=从从 i 到到 j 有一条路径有一条路径 i是是 j 的的 直接前驱直接前驱:=E(G)所以所以 j 称为称为 i 的的后继后继(直接后继直接后继)偏序偏序:=一种优先关系,同时具有一种优先关系,同时具有传递性传递性(i k,k j i j)和和 非自反性非自反性(i i 是不可能的是不可能的).Note:如果优先关系是自反的,那么必定有一个如果优先关系是自反的,那么必定有一个 i 存在,使得存在,使得
20、i 是是 i 的前驱。那就是说,的前驱。那就是说,i 必须在必须在 i 开始之前被完成(显然开始之前被完成(显然不合理)。因此如果一个项目是不合理)。因此如果一个项目是可行的,可行的,它必然是它必然是非自反非自反的。的。2 拓扑排序拓扑排序【定义定义】拓扑排序拓扑排序是图中顶点的一个线性排序,它使得对任意两个顶点是图中顶点的一个线性排序,它使得对任意两个顶点 i,j,如果如果 i 是是 j 的一个前驱,那么在排序中的一个前驱,那么在排序中 i 出现在出现在 j 的前面。的前面。例例 一个可能的计算机科学学位课程学习表顺序如下:一个可能的计算机科学学位课程学习表顺序如下:Course numbe
21、r Course name Prerequisites C1 Programming I None C2 Discrete Mathematics None C4 Calculus I None C3 Data Structure C1,C2 C5 Calculus II C4 C6 Linear Algebra C5 C7 Analysis of Algorithms C3,C6 C15 Numerical Analysis C6 C8 Assembly Language C3 C10 Programming Languages C7 C9 Operating Systems C7,C8 C
22、12 Artificial Intelligence C7 C13 Computational Theory C7 C11 Compiler Design C10 C14 Parallel Algorithms C13 试着用试着用AOV图图表示出来表示出来求出给定求出给定DAG的一个拓扑序列,相当于进行一个作业调度。的一个拓扑序列,相当于进行一个作业调度。如何来求一个拓扑序列呢?如何来求一个拓扑序列呢?简单算法:简单算法:step 1 如果找得到任何一个入度为如果找得到任何一个入度为0的顶点的顶点v,则,则step 2,否则,否则step 4;step 2 输出顶点输出顶点v,并从图中删除该
23、顶点以及与其相连的所有边;,并从图中删除该顶点以及与其相连的所有边;step 3 对改变后的图重复这一过程,转对改变后的图重复这一过程,转step 1;step 4 如果已经输出全部顶点,则结束;否则该有向图不是如果已经输出全部顶点,则结束;否则该有向图不是DAG。理论依据是理论依据是基于基于下面的结论:一个顶点数下面的结论:一个顶点数|V|1的有向图的有向图,如果每个顶点的入度都大于,如果每个顶点的入度都大于0,那么它必定存在回路。,那么它必定存在回路。2 拓扑排序拓扑排序Note:对一个图来说,拓扑排序对一个图来说,拓扑排序不是唯一的。不是唯一的。如,要达到获得计如,要达到获得计算机科学学
24、位的条件有几种途径(拓扑排序)。算机科学学位的条件有几种途径(拓扑排序)。测试一个测试一个 AOV 的可行性,可能的话生成一个拓扑排序。的可行性,可能的话生成一个拓扑排序。void Topsort(Graph G)int Counter;Vertex V,W;for(Counter=0;Counter NumVertex;Counter+)V=FindNewVertexOfDegreeZero();if(V=NotAVertex)Error(“Graph has a cycle”);break;TopNum V =Counter;/*or output V*/for(each W adjace
25、nt to V)Indegree W ;/*O(|V|)*/T=O(|V|2)检查整个检查整个InDegree数组,数组,所需时间是所需时间是O(|V|),此函数,此函数被调用被调用|V|次,故本算法的次,故本算法的时间复杂性为时间复杂性为 O(|V|2)2 拓扑排序拓扑排序 实现实现:将所有度为将所有度为0的未标记顶点放在一个特殊的盒子里(队列或栈)。的未标记顶点放在一个特殊的盒子里(队列或栈)。v1v2v6v7v3v4v5void Topsort(Graph G)Queue Q;int Counter=0;Vertex V,W;Q=CreateQueue(NumVertex);MakeEm
展开阅读全文