收藏 分享(赏)

北京信息科技大学数据机构课件第7章 图_200909.ppt

上传人:精品资料 文档编号:8555999 上传时间:2019-07-03 格式:PPT 页数:172 大小:2.67MB
下载 相关 举报
北京信息科技大学数据机构课件第7章 图_200909.ppt_第1页
第1页 / 共172页
北京信息科技大学数据机构课件第7章 图_200909.ppt_第2页
第2页 / 共172页
北京信息科技大学数据机构课件第7章 图_200909.ppt_第3页
第3页 / 共172页
北京信息科技大学数据机构课件第7章 图_200909.ppt_第4页
第4页 / 共172页
北京信息科技大学数据机构课件第7章 图_200909.ppt_第5页
第5页 / 共172页
点击查看更多>>
资源描述

1、第七章 图,本章的主要内容是:,图的逻辑结构 图的存储结构及实现 图的遍历 图的连通性与最小生成树 拓扑排序 关键路径 最短路径,欧拉1707年出生在瑞士的巴塞尔城,19岁开始发表论文,直到76岁。几乎每一个数学领域都可以看到欧拉的名字,从初等几何的欧拉线,多面体的欧拉定理,立体解析几何的欧拉变换公式,四次方程的欧拉解法到数论中的欧拉函数,微分方程的欧拉方程,级数论的欧拉常数,变分学的欧拉方程,复变函数的欧拉公式等等。据统计他那不倦的一生,共写下了886本书籍和论文,其中分析、代数、数论占40%,几何占18%,物理和力学占28%,天文学占11%,弹道学、航海学、建筑学等占3%。 1733年,年

2、仅26岁的欧拉担任了彼得堡科学院数学教授。1741年到柏林担任科学院物理数学所所长,直到1766年,重回彼得堡,没有多久,完全失明。欧拉在数学上的建树很多,对著名的哥尼斯堡七桥问题的解答开创了图论的研究。,图论欧拉,能否从某个地方出发,穿过所有的桥仅一次后再回到出发点?,哥尼斯堡七桥问题,七桥问题的图模型,哥尼斯堡七桥问题,欧拉回路的判定规则: 1.如果通奇数桥的地方多于两个,则不存在欧拉回路; 2.如果只有两个地方通奇数桥,可以从这两个地方之一出发,找到欧拉回路; 3.如果没有一个地方是通奇数桥的,则无论从哪里出发,都能找到欧拉回路。,图的定义,7.1 图的逻辑结构,图是一种数据结构。由顶点

3、的有穷非空集合和顶点之间关系的集合组成,通常表示为:G=(V,E) 其中:G表示一个图,V是具有相同特性的数据元素的集合,称为顶点集;E是图G中顶点之间关系的集合,成为边集或弧集。,E| v,wV 且 P(v,w)或(v,w)| v,wV 且 P(v,w)表示从 v 到 w 的一条弧,称 v 为弧头,w 为弧尾。(v,w)表示v与w之间的一条边。 谓词 P(v,w) 定义了弧 或边(v, w)的意义或信息。,7.1 图的逻辑结构,如果图的任意两个顶点之间的边都是无向边,则称该图为无向图。,若顶点vi和vj之间的边没有方向,则称这条边为无向边,表示为(vi,vj)。,若从顶点vi到vj的边有方向

4、,则称这条边为有向边,表示为。,如果图的任意两个顶点之间的边都是有向边,则称该图为有向图。,7.1 图的逻辑结构,图的基本术语,简单图:在图中,若不存在顶点到其自身的边,且同一条边不重复出现。,数据结构中讨论的都是简单图。,7.1 图的逻辑结构,图的基本术语,邻接、依附 无向图中,对于任意两个顶点vi和顶点vj,若存在边(vi,vj),则称顶点vi和顶点vj互为邻接点,同时称边(vi,vj)依附于顶点vi和顶点vj。,V1的邻接点: V2 、V4 V2的邻接点: V1 、V3 、V5,7.1 图的逻辑结构,图的基本术语,邻接、依附 有向图中,对于任意两个顶点vi和顶点vj,若存在弧,则称顶点v

5、i邻接到顶点vj,顶点vj邻接自顶点vi,同时称弧依附于顶点vi和顶点vj 。,V1的邻接点: V2 、V3 V3的邻接点: V4,在线性结构中,数据元素之间仅具有线性关系; 在树结构中,结点之间具有层次关系; 在图结构中,任意两个顶点之间都可能有关系。,不同结构中逻辑关系的对比,在线性结构中,元素之间的关系为前驱和后继; 在树结构中,结点之间的关系为双亲和孩子; 在图结构中,顶点之间的关系为邻接。,不同结构中逻辑关系的对比,无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。,有向完全图:在有向图中,如果任意两个顶点之间都存在方向相反的两条弧,则称该图为有向完全图。,

6、图的基本术语,7.1 图的逻辑结构,含有n个顶点的无向完全图有多少条边? 含有n个顶点的有向完全图有多少条弧?,7.1 图的逻辑结构,含有n个顶点的无向完全图有n(n-1)/2条边。 含有n个顶点的有向完全图有n(n-1)条边。,稀疏图:称边数很少的图为稀疏图(enlogn); 稠密图:称边数很多的图为稠密图(enlogn) 。,顶点的度:在无向图中,顶点v的度是指依附于该顶点的边数,通常记为TD (v)。,7.1 图的逻辑结构,图的基本术语,顶点的入度:在有向图中,顶点v的入度是指以该顶点为弧头的弧的数目,记为ID (v); 顶点的出度:在有向图中,顶点v的出度是指以该顶点为弧尾的弧的数目,

7、记为OD (v)。,7.1 图的逻辑结构,图的基本术语,在具有n个顶点、e条边的无向图G中,各顶点的度之和与边数之和的关系?,7.1 图的逻辑结构,图的基本术语,在具有n个顶点、e条边的有向图G中,各顶点的入度之和与各顶点的出度之和的关系?与边数之和的关系?,权:是指对边赋予的有意义的数值量。 网:边上带权的图,也称网图。,7.1 图的逻辑结构,图的基本术语,路径:在无向图G=(V, E)中,从顶点vp到顶点vq之间的路径是一个顶点序列(vp=vi0,vi1,vi2, , vim=vq),其中,(vij-1,vij)E(1jm)。若G是有向图,则路径也是有方向的,顶点序列满足E。,7.1 图的

8、逻辑结构,图的基本术语,一般情况下,图中的路径不惟一。,V1 到V4的路径: V1 V4V1 V2 V3 V4V1 V2 V5V3 V4,路径长度:,7.1 图的逻辑结构,图的基本术语,非带权图路径上边的个数 带权图路径上各边的权之和,V1 V4:长度为1 V1 V2 V3 V4 :长度为3 V1 V2 V5V3 V4 :长度为4,路径长度:,7.1 图的逻辑结构,图的基本术语,非带权图路径上边的个数 带权图路径上各边的权之和,V1 V4:长度为8 V1 V2 V3 V4 :长度为7 V1 V2 V5V3 V4 :长度为15,回路(环):第一个顶点和最后一个顶点相同的路径。 简单路径:序列中顶

9、点不重复出现的路径。 简单回路(简单环):除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路。,7.1 图的逻辑结构,图的基本术语,子图:若图G=(V,E),G=(V,E),如果VV 且E E ,则称图G是G的子图。,7.1 图的逻辑结构,图的基本术语,连通图:在无向图中,如果从一个顶点vi到另一个顶点vj(ij)有路径,则称顶点vi和vj是连通的。如果图中任意两个顶点都是连通的,则称该图是连通图。 连通分量:非连通图的极大连通子图称为连通分量。,7.1 图的逻辑结构,图的基本术语,如何求得一个非连通图的连通分量?,7.1 图的逻辑结构,V1,V2,V3,V4,V5,V6,V7,图的基本

10、术语,连通分量是对无向图的一种划分。,强连通图:在有向图中,对图中任意一对顶点vi和vj (ij),若从顶点vi到顶点vj和从顶点vj到顶点vi均有路径,则称该有向图是强连通图。 强连通分量:非强连通图的极大强连通子图。,7.1 图的逻辑结构,图的基本术语,如何求得一个非连通图的连通分量?,7.1 图的逻辑结构,图的基本术语,V1,V2,生成树:n个顶点的连通图G的生成树是包含G中全部顶点的一个极小连通子图。(n个顶点的数至少有n-1条边),生成森林:在非连通图中,由每个连通分量都可以得到一棵生成树,这些连通分量的生成树就组成了一个非连通图的生成森林。,如何理解极小连通子图?,7.1 图的逻辑

11、结构,图的基本术语,7.1 图的逻辑结构,图的抽象数据类型定义,7.1 图的逻辑结构,ADT Graph 数据对象V;V是具有相同特性的数据元素的集合。 数据关系R: R=E(弧集或边集) 基本操作P:构造、销毁、顶点操作、弧操作、遍历等 CreatGraph(&G, V, E) / 按定义(V, E) 构造图 DestroyGraph(&G) / 销毁图 LocateVex(G, u) / 若G中存在顶点u,则返回该顶点在图中“位置” ;否则返回其它信息。 GetVex(G, v) / 返回 v 的值。 PutVex(&G, v, value) / 对 v 赋值value。 FirstAdj

12、Vex(G, v) / 返回 v 的“第一个邻接点” 。若该顶点在 G 中没有邻接点,则返回“空”。,图的抽象数据类型定义,7.1 图的逻辑结构,NextAdjVex(G, v, w); / 返回 v 的(相对于 w 的) “下一个邻接/点 ”。 若 w 是 v 的最后一个邻接点,则返回“空”。 InsertVex( /从顶点v起广度优先遍历图G,并/对每个顶点调用函数Visit一次且仅一次。 ADT Graph,7.2 图的存储结构及实现,是否可以采用顺序存储结构存储图?,图的特点:顶点之间的关系是m:n,即任何两个顶点之间都可能存在关系(边或弧),无法通过存储位置表示这种任意的逻辑关系,所

13、以,图无法采用顺序存储结构。,如何存储图?,考虑图的定义,图是由顶点和边组成的,分别考虑如何存储顶点、如何存储边。,线性表、二叉树都可以两种不同的存储结构 -顺序和链式存储结构来存储。,7.2 图的存储结构及实现,如何设计图的顶点结构和边结构呢?,如果按照度数最大的结点设计结点存储结构,浪费;若按照各自的度数设计又会造成操作的不便。下面我们介绍的四种存储表示法将分别对图中的顶点结构和弧(边)结构分别进行设计。,一、邻接矩阵(数组表示法),基本思想:用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系。,7.2 图的存储结构及实现,假设图G(V,E)有n个

14、顶点,则邻接矩阵是一个nn的方阵,定义为:,无向图的邻接矩阵的特点?,无向图的邻接矩阵,7.2 图的存储结构及实现,主对角线为 0 且一定是对称矩阵。,如何求顶点i的度?,无向图的邻接矩阵,7.2 图的存储结构及实现,V1,V3,V4,V2,邻接矩阵的第i行(或第i列)非零元素的个数。,如何判断顶点 i 和 j 之间是否存在边?,无向图的邻接矩阵,7.2 图的存储结构及实现,V1,V3,V4,V2,测试邻接矩阵中相应位置的元素arcij是否为1。,如何求顶点 i 的所有邻接点?,无向图的邻接矩阵,7.2 图的存储结构及实现,V1,V3,V4,V2,将数组中第 i 行元素扫描一遍,若arcij为

15、1,则顶点 j 为顶点 i 的邻接点。,7.2 图的存储结构及实现,有向图的邻接矩阵,有向图的邻接矩阵一定不对称吗?,不一定,例如有向完全图。,7.2 图的存储结构及实现,有向图的邻接矩阵,如何求顶点 i 的出度?,邻接矩阵的第 i 行元素之和。,7.2 图的存储结构及实现,有向图的邻接矩阵,如何求顶点 i 的入度?,邻接矩阵的第 i 列元素之和。,7.2 图的存储结构及实现,有向图的邻接矩阵,如何判断从顶点 i 到顶点 j 是否存在弧?,测试邻接矩阵中相应位置的元素arcij是否为1。,网图的邻接矩阵,7.2 图的存储结构及实现,网图的邻接矩阵可定义为:,typedef struct Arc

16、Cell / 弧的定义VRType adj; / VRType是顶点关系类型。/ 对无权图,用1或0表示相邻否;/ 对带权图,则为权值类型。Info *info;/该弧相关信息的指针 AdjMatrixN N;/这里假设N为最大顶点个数,7.2 图的存储结构及实现,Status CreateGraph( MGraph / CreateGraph,7.2 图的存储结构及实现,邻接矩阵中图的基本操作构造函数,确定图的顶点个数和边的个数; 2. 输入顶点信息,构造顶点向量vertexvexnum; 3. 初始化邻接矩阵; 4. 依次输入每条边存储在邻接矩阵arc中;4.1 确定边依附的两个顶点的序号

17、i, j;4.2 将邻接矩阵的第i行第j列置为边的权值w;4.3 将邻接矩阵的第j行第i列置为边的权值w ;,7.2 图的存储结构及实现,Status CreateUDN(MGraph ,7.2 图的存储结构及实现,for (k=0; k的权值/ if (IncInfo) scanf(G.arcsij.info); / 输入弧含有相关信息G.arcsji.adj = G.arcsij.adj; / 置的对称弧return OK; / CreateUDN,7.2 图的存储结构及实现,二、邻接表,邻接表存储的基本思想:对于图的每个顶点vi,将所有邻接于vi的顶点链成一个单链表,称为顶点vi的边表(

18、对于有向图则称为出边表),所有边表的头指针和存储顶点信息的一维数组构成了顶点表。,7.2 图的存储结构及实现,图的邻接矩阵存储结构的空间复杂度? 如果为稀疏图则会出现什么现象?,假设图G有n个顶点e条边,则存储该图需要O(n2) 。,邻接表有两种结点结构:顶点表结点和边表结点。,头(顶点)结点 表(边)结点,vertex:数据域,存放顶点信息。 firstedge:指针域,指向边表中第一个结点。 adjvex:邻接点域,边的终点在顶点表中的下标。 next:指针域,指向边表中的下一个结点。,7.2 图的存储结构及实现,Typedef struct ArcNode int adjvex; Arc

19、Node *nextarc; ArcNode;Typedef struct VNode Vertextype data;ArcNode *firstarc; VNode,AdjListN;/N为图的最大顶点数,定义邻接表的结点,7.2 图的存储结构及实现,表(边)结点,头(顶点)结点,typedef struct AdjList vertices;int vexnum, arcnum; int kind; / 图的种类标志 ALGraph;,图的结构定义,7.2 图的存储结构及实现,7.2 图的存储结构及实现,无向图的邻接表,表(边)结点表示什么?,每个表(边)结点对应图中的一条边,邻接表的空

20、间复杂度为O(n+e)。,7.2 图的存储结构及实现,无向图的邻接表,如何求顶点 i 的度?,顶点i的边链表中结点的个数。,如何判断顶点 i 和顶点 j 之间是否存在边?,测试顶点 i 的边链表中是否存在终点为 j 的结点。,7.2 图的存储结构及实现,无向图的邻接表,7.2 图的存储结构及实现,有向图的邻接表,如何求顶点 i 的出度?,顶点 i 的出边链表中结点的个数,7.2 图的存储结构及实现,有向图的邻接表,如何求顶点 i 的入度?,各顶点的出边链表中以顶点 i 为终点的结点个数。,7.2 图的存储结构及实现,有向图的逆向邻接表,如何求顶点 i 的入度?,顶点i的入边链表中的结点个数,7

21、.2 图的存储结构及实现,有向图的邻接表,如何求顶点 i 的所有邻接点?,遍历顶点 i 的边链表,该边链表中的所有终点都是顶点 i 的邻接点。,7.2 图的存储结构及实现,网图的邻接表,邻接表中图的基本操作构造函数,1. 确定图的顶点个数和边的个数; 2. 输入顶点信息,初始化该顶点的边表; 3. 依次输入边的信息并存储在边表中;3.1 输入边所依附的两个顶点的序号i和j;3.2 生成邻接点序号为j的边表结点s;3.3 将结点s插入到第i个边表的头部;,7.2 图的存储结构及实现,优点:在边稀疏的情况下,用邻接表比邻接矩阵节省存储空间,当和边相关的信息较多时更是如此。,缺点:在邻接表上容易找到

22、任一顶点的第一个邻接点和下一个邻接点,但要判定任意两个顶点之间是否有边或弧相连则需搜索两个链表,不及邻接矩阵方便。,N个顶点,e条边的无向图,邻接表需要n个头结点 和2e个表结点。,7.2 图的存储结构及实现,三、十字链表-有向图的另一种链式存储结构,7.2 图的存储结构及实现,将邻接表与逆邻接表合二为一?为什么要合并?,十字链表的结点结构,tailvex:弧尾顶点在图中的位置,即在顶点表中的下标; headvex:弧头顶点在图中的位置,即在顶点表中的下标; headlink:指向弧头相同的下一条弧的指针; taillink:指向弧尾相同的下一条弧的指针; Info :指向该弧的相关信息。,7

23、.2 图的存储结构及实现,data:数据域,存放顶点信息; firstin:指向该顶点的第一条入弧的指针; firstout:指向该顶点的第一条出弧的指针 ;,7.2 图的存储结构及实现,十字链表存储有向图,typedef struct ArcBox / 弧的结构表示int tailvex, headvex; InfoType *info;struct ArcBox *hlink, *tlink; ArcBox;,typedef struct VexNode / 顶点的结构表示VertexType data;ArcBox *firstin, *firstout; VexNode;,有向图的十字

24、链表存储表示,7.2 图的存储结构及实现,typedef struct VexNode xlistN; /N为最大顶点数/ 顶点结点(表头向量) int vexnum, arcnum;/有向图的当前顶点数和弧数 OLGraph;,有向图的结构表示(十字链表),7.2 图的存储结构及实现,有向图十字链表结构表示的优点:容易求得顶点的入度和出度,Status CreateDG(OLGraph /createDG,采用十字链表法构造有向图的算法,7.2 图的存储结构及实现,四、无向图的邻接多重表存储表示,顶点的结点结构,边的结点结构,尽管邻接表能很好的表示无向图,但每条边(vi,vj)有两个结点,分

25、别在第i个和第j个链表中,给图的操作带来不便。,7.2 图的存储结构及实现,四、无向图的邻接多重表存储表示,7.2 图的存储结构及实现,四、无向图的邻接多重表存储表示,Typedef emnu unvisited,visited VisitIf; typedef struct Ebox VisitIf mark; / 访问标记int ivex, jvex;/该边依附的两个顶点的位置struct EBox *ilink, *jlink; InfoType *info; / 该边信息指针 EBox;,边的结构表示,7.2 图的存储结构及实现,typedef struct / 邻接多重表VexBox

26、 adjmulistN;int vexnum, edgenum; AMLGraph;,顶点的结构表示,typedef struct VexBox VertexType data;EBox *firstedge; / 指向第一条依附该顶点的边 VexBox;,无向图的结构表示,7.2 图的存储结构及实现,图的存储结构的比较邻接矩阵和邻接表,O(n2),O(n+e),7.2 图的存储结构及实现,图的遍历操作,图的遍历是在从图中某一顶点出发,对图中所有顶点访问一次且仅访问一次。,7.3 图的遍历,图的遍历操作要解决的关键问题, 在图中,如何选取遍历的起始顶点?,在线性表中,数据元素在表中的编号就是元

27、素在序列中的位置,因而其编号是唯一的; 在树中,将结点按层序编号,由于树具有层次性,因而其层序编号也是唯一的; 在图中,任何两个顶点之间都可能存在边,顶点是没有确定的先后次序的,所以,顶点的编号不唯一。 为了定义操作的方便,将图中的顶点按任意顺序排列起来,比如,按顶点的存储顺序。,解决方案:从编号小的顶点开始 。,7.3 图的遍历, 从某个起点始可能到达不了所有其它顶点,怎么办?,图的遍历操作要解决的关键问题,解决方案:多次调用从某顶点出发遍历图的算法。,下面仅讨论从某顶点出发遍历图的算法。,7.3 图的遍历, 因图中可能存在回路,某些顶点可能会被重复访问,那么如何避免遍历不会因回路而陷入死循

28、环。 在图中,一个顶点可以和其它多个顶点相连,当这样的顶点访问过后,如何选取下一个要访问的顶点?,图的遍历操作要解决的关键问题,解决方案:附设访问标志数组visitedn 。,解决方案:深度优先遍历和广度优先遍历。,7.3 图的遍历,约翰霍普克洛夫特1939年生于西雅图。1961年进入斯坦福大学研究生院深造,1962年获硕士学位,1964年获博士学位。毕业后先后在普林斯顿大学、斯坦福大学等著名学府工作,也曾任职于一些科学研究机构如 NSF(美国科学基金会)和 NRC(美国国家研究院)。,罗伯特陶尔扬1948年4月30日生于加利福尼亚州 。1969年本科毕业,进入斯坦福大学研究生院,1972年获

29、得博士学位。,1986年图灵奖获得者,7.3 图的遍历,1. 深度优先遍历,基本思想 :, 访问顶点v; 从v的未被访问的邻接点中选取一个顶点w,从w出发进行深度优先遍历; 重复上述两步,直至图中所有和v有路径相通的顶点都被访问到。,7.3 图的遍历,深一层递归,递归返回,深度优先遍历序列?入栈序列?出栈序列?,V1,遍历序列:,V1,V2,V2,V4,V4,V5,V5,7.3 图的遍历,深一层递归,递归返回,深度优先遍历序列?入栈序列?出栈序列?,V1,遍历序列:,V1,V2,V2,V4,V4,V5,V8,V8,7.3 图的遍历,深一层递归,递归返回,深度优先遍历序列?入栈序列?出栈序列?,

30、V1,遍历序列:,V1,V2,V2,V4,V4,V5,V8,7.3 图的遍历,深一层递归,递归返回,深度优先遍历序列?入栈序列?出栈序列?,V1,遍历序列:,V1,V7,V2,V4,V5,V8,V3,V3,V6,V6,V7,7.3 图的遍历,从上页的图解可见:,1. 从深度优先搜索遍历连通图的过程类似于树的先根遍历;,解决的办法是:为每个顶点设立一个 “访问标志 visitedw”。,2. 如何判别V的邻接点是否被访问?,7.3 图的遍历,void DFS(Graph G, int v) / 从顶点v出发,深度优先搜索遍历连通图 Gvisitedv = TRUE; VisitFunc(v);f

31、or(w=FirstAdjVex(G, v);w!=0; w=NextAdjVex(G,v,w)if (!visitedw) DFS(G, w); / 对v的尚未访问的邻接顶点w/ 递归调用DFS / DFS,7.3 图的遍历,1.将图中每个顶点的访问标志设为 FALSE; 2.搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。,非连通图的深度优先搜索遍历算法,7.3 图的遍历,Boolean visitedmax;/访问标志数组 Status (*VisitFunc)(int v);/函数变量void DFSTraverse(Graph G, S

32、tatus (*Visit)(int v) / 对图 G 作深度优先遍历。VisitFunc = Visit; for (v=0; vG.vexnum; +v) visitedv = FALSE; / 访问标志数组初始化for (v=0; vG.vexnum; +v) if (!visitedv) DFS(G, v);/ 对尚未访问的顶点调用DFS ,7.3 图的遍历,2. 广度优先遍历,基本思想:, 访问顶点v; 依次访问v的各个未被访问的邻接点v1, v2, , vk; 分别从v1,v2,vk出发依次访问它们未被访问的邻接点,并使“先被访问顶点的邻接点”先于“后被访问顶点的邻接点”被访问。

33、直至图中所有与顶点v有路径相通的顶点都被访问到。,7.3 图的遍历,广度优先遍历序列?入队序列?出队序列?,遍历序列:,V1,V1,7.3 图的遍历,广度优先遍历序列?入队序列?出队序列?,遍历序列:,V1,V2,V2,V3,V3,7.3 图的遍历,广度优先遍历序列?入队序列?出队序列?,遍历序列:,V1,V2,V3,V3,V4,V4,V5,V5,7.3 图的遍历,广度优先遍历序列?入队序列?出队序列?,遍历序列:,V1,V2,V3,V4,V4,V5,V5,V6,V6,V7,V7,7.3 图的遍历,广度优先遍历序列?入队序列?出队序列?,遍历序列:,V1,V2,V3,V4,V5,V5,V6,V

34、6,V7,V7,V8,V8,7.3 图的遍历,void BFSTraverse(Graph G, Status (*Visit)(int v)for (v=0; vG.vexnum; +v)visitedv = FALSE; /初始化访问标志InitQueue(Q); / 置空的辅助队列Qfor ( v=0; vG.vexnum; +v )if ( !visitedv) / v 尚未访问 / BFSTraverse, ,7.3 图的遍历,visitedv = TRUE; Visit(v); / 访问v EnQueue(Q, v); / v入队列 while (!QueueEmpty(Q) De

35、Queue(Q, u); / 队头元素出队并置为ufor(w=FirstAdjVex(G, u); w!=0; w=NextAdjVex(G,u,w)if ( ! visitedw) visitedw=TRUE; Visit(w);EnQueue(Q, w); / 访问的顶点w入队列 / if / while,7.3 图的遍历,7.4 图的连通性,要想判定一个无向图是否为连通图,或有几个连通分量,通过对无向图遍历即可得到结果。,非连通图:需从多个顶点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量中的顶点集。,连通图:仅需从图中任一顶点出发,进行深度

36、优先搜索(或广度优先搜索),便可访问到图中所有顶点。,7.4.1无向图的连通性,count=0; 2. for (图中每个顶点v)2.1 if (v尚未被访问过) 2.1.1 count+;2.1.2 从v出发遍历该图; if (count=1) printf(“图是连通的n”);else printf(“图中有连通分量数:,%d”, count);,求无向图的连通分量,7.4 图的连通性,*7.4.2有向图的连通性, 从某顶点出发进行深度优先遍历,并按其所有邻接点都访问(即出栈)的顺序将顶点排列起来。 从最后完成访问的顶点出发,沿着以该顶点为头的弧作逆向的深度优先遍历。若不能访问到所有顶点,

37、则从余下的顶点中最后访问的那个顶点出发,继续作逆向的深度优先遍历,直至有向图中所有顶点都被访问到为止。 每一次逆向深度优先遍历所访问到的顶点集便是该有向图的一个强连通分量的顶点集。,7.4 图的连通性,(a)深度优先生成树 (b) 广度优先生成树,7.4.3 生成树,7.4 图的连通性,由深度优先遍历得到的为深度优先生成树,由广度优先遍历得到的为广度优先生成树。,一个连通图的生成树可能不唯一,由不同的遍历次序、从不同顶点出发进行遍历都会得到不同的生成树。,对于非连通图,通过图的遍历,将得到的是生成森林。,结论:,7.4 图的连通性,7.4.3 生成树,生成树的代价:设G=(V,E)是一个无向连

38、通网,生成树上各边的权值之和称为该生成树的代价。,最小生成树:在图G所有生成树中,代价最小的生成树称为最小生成树(Minimum Cost Spanning Tree)。,7.4.4 最小生成树,最小生成树的概念可以应用到许多实际问题中。 例:在n个城市之间建造通信网络,至少要架设n-1条通信线路,而每两个城市之间架设通信线路的造价是不一样的,那么如何设计才能使得总造价最小?,7.4 图的连通性最小生成树,MST性质,假设G=(V, E)是一个无向连通网,U是顶点集V的一个非空子集。若(u, v)是一条具有最小权值的边,其中uU,vVU,则必存在一棵包含边(u, v)的最小生成树。,7.4 图

39、的连通性最小生成树,基本思想:设G=(V, E)是具有n个顶点的连通网,T=(U, TE)是G的最小生成树, T的初始状态为U=u0(u0V),TE= ,重复执行下述操作:在所有uU,vV-U的边中找一条代价最小的边(u, v)并入集合TE,同时v并入U,直至U=V。,关键:是如何找到连接U和V-U的最短边。,1. 普里姆(Prim)算法,利用MST性质,可以用下述方法构造候选最短边集:对应V-U中的每个顶点,保留从该顶点到U中的各顶点的最短边。,7.4 图的连通性最小生成树,U=A V-U=B, C, D, E, F cost=(A, B)34, (A, C)46, (A, D),(A, E

40、),(A, F)19,25,12,34,19,26,46,38,17,25,Prim算法,7.4 图的连通性最小生成树,Prim算法,25,12,34,19,26,46,38,17,25,U=A, F V-U=B, C, D, E cost=(A, B)34,(F, C)25, (F, D)25,(F, E)26,7.4 图的连通性最小生成树,Prim算法,25,12,34,19,26,46,38,17,25,U=A, F, C V-U=B, D, E cost=(A, B)34, (C, D)17, (F, E)26,7.4 图的连通性最小生成树,Prim算法,25,12,34,19,26,

41、46,38,17,25,U=A, F, C, D V-U=B, E cost=(A, B)34, (F, E)26,7.4 图的连通性最小生成树,Prim算法,25,12,34,19,26,46,38,17,25,U=A, F, C, D, E V-U=B cost=(E, B)12,7.4 图的连通性最小生成树,Prim算法,25,12,34,19,26,46,38,17,25,U=A, F, C, D, E, B V-U= ,7.4 图的连通性最小生成树,设置一个辅助数组,对当前VU集中的每个顶点,记录和顶点集U中顶点相连接的代价最小的边:,struct VertexType adjvex

42、; / U集中的顶点序号VRType lowcost; / 边的权值 closedgeN;,如何用数组lowcost和adjvex表示候选最短边集?,7.4 图的连通性最小生成树,a,b,c,d,e,g,f,19,5,14,18,27,16,8,21,3,a,e,12,d,c,b,7,a,a,a,19,14,18,14,例如:,e,12,e,e,8,16,8,d,3,d,d,7,21,3,c,5,5,7.4 图的连通性最小生成树,void MiniSpanTree_P(MGraph G, VertexType u) /用普里姆算法从顶点u出发构造网G的最小生成树k = LocateVex (

43、G, u ); for ( j=0; jG.vexnum; +j ) / 辅助数组初始化if (j!=k) closedgej = u, G.arcskj.adj ; closedgek.lowcost = 0; / 初始,Uufor (i=0; iG.vexnum; +i) ,继续向生成树上添加顶点;,7.4 图的连通性最小生成树,k = minimum(closedge); / 求出加入生成树的下一个顶点(k)printf(closedgek.adjvex, G.vexsk); / 输出生成树上一条边closedgek.lowcost = 0; / 第k顶点并入U集for (j=0; jG

44、.vexnum; +j) /修改其它顶点的最小边if (G.arcskj.adj closedgej.lowcost)closedgej = G.vexsk, G.arcskj.adj ;,7.4 图的连通性最小生成树,2. 克鲁斯卡尔(Kruskal)算法,基本思想:设无向连通网为G(V, E),令G的最小生成树为T(U, TE),其初态为UV,TE ,然后,按照边的权值由小到大的顺序,考察G的边集E中的各条边。若被考察的边的两个顶点属于T的两个不同的连通分量,则将此边作为最小生成树的边加入到T中,同时把两个连通分量连接为一个连通分量;若被考察边的两个顶点属于同一个连通分量,则舍去此边,以免

45、造成回路,如此下去,当T中的连通分量个数为1时,此连通分量便为G的一棵最小生成树。,7.4 图的连通性最小生成树,25,12,34,17,26,46,38,19,25,连通分量A, B, C, D, E, F,7.4 图的连通性最小生成树,25,12,34,17,26,46,38,19,25,连通分量A, B, C, D, E, F,连通分量A, B, E, C, D, F,7.4 图的连通性最小生成树,25,12,34,17,26,46,38,19,25,连通分量A, B, E, C, D, F,连通分量A, F, B, E, C, D,7.4 图的连通性最小生成树,25,12,34,17,

46、26,46,38,19,25,连通分量A, F, B, E, C, D,连通分量A, F, B, E, C, D,7.4 图的连通性最小生成树,25,12,34,17,26,46,38,19,25,连通分量A, F, B, E, C, D,连通分量A, F, C, D, B, E,7.4 图的连通性最小生成树,25,12,34,17,26,46,38,19,25,连通分量A, F, C, D, B, E,连通分量A, F, C, D, B, E,7.4 图的连通性最小生成树,1. 初始化:U=V; TE= ; 2. 循环直到T中的连通分量个数为1 2.1 在E中寻找最短边(u,v);2.2 如果顶点u、v位于T的两个不同连通分量,则2.2.1 将边(u,v)并入TE;2.2.2 将这两个连通分量合为一个;2.3 在E中标记边(u,v),使得(u,v)不参加后续最短边的选取;,Kruskal算法伪代码,7.4 图的连通性最小生成树,普里姆算法,克鲁斯卡尔算法,时间复杂度,O(n2),O(eloge),稠密图,稀疏图,算法名,

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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