1、1,第13章 图,主要内容,图的基本概念 图的遍历 图的连通性与最小生成树,图(Graph) 中任意两个结点之间都可以直接相关,因此图形结构非常复杂。但是图的用途也极其广泛,已渗入到语言学、逻辑学、物理、化学、电讯工程、计算机科学以及数学等其他分支学科当中。 我们主要讨论图的基本概念与图的存储结构。,13.1 图的基本概念,13.1 图的基本概念,图的定义 图(Graph)图G是由两个集合V(G)和E(G)组成的,记为G=(V,E)其中:V(G)是顶点的非空有限集E(G)是边的有限集合,边是顶点的无序对或有序对。 图的分类有向图无向图,有向图与无向图 若图G中的每条边都是有方向的,则称G为有向
2、图。有向边也称为弧。若图G中的每条边都是没有方向的,则称G为无向图。 完全图 对有n个顶点的图,若为无向图且边数为n(n-1)/2,则称其为无向完全图;若为有向图且边数为n(n-1) ,则称其为有向完全图。 邻接顶点 若(vi,vj)是一条无向边,则称顶点vi和vj互为邻接点,或称vi和vj相邻接,并称边(vi,vj)关联于顶点vi和vj,或称(vi,vj)与顶点vi和vj相关联。,13.1 图的基本概念,13.1 图的基本概念,图的定义 有向图有向图G是由两个集合V(G)和E(G)组成的。其中:V(G)是顶点的非空有限集。E(G)是有向边(也称弧)的有限集合,弧是顶点的有序对,记为,v,w是
3、顶点,v为弧尾,w为弧头。,13.1 图的基本概念,例如:G1 = V1 = A,B,C,D,E E1 = , ,E,A,C,B,D,13.1 图的基本概念,图的定义 无向图无向图G是由两个集合V(G)和E(G)组成的。其中:V(G)是顶点的非空有限集。E(G)是边的有限集合,边是顶点的无序对,记为 (v,w) 或 (w,v),并且(v,w)=(w,v)。,13.1 图的基本概念,例如:G2 = (V2,E2)V2 = v0,v1,v2,v3,v4 E2 = (v0,v1),(v0,v3),(v1,v2),(v1,v4),(v2,v3),(v2,v4) ,V0,V4,V3,V1,V2,13.1
4、 图的基本概念,例如:G2 = V2 = v0,v1,v2,v3 E2 = , ,图G1中:V(G1) = 1 , 2 , 3 , 4 , 5, 6 E(G1) = , , , , , , ,13.1 图的基本概念,图的应用举例例1、交通图(公路、铁路)顶点:地点 边:连接地点的路例2、电路图顶点:元件 边:连接元件之间的线路例3、通讯线路图顶点:地点 边:地点间的连线例4、各种流程图如产品的生产流程图顶点:工序 边:各道工序之间的顺序关系,13.1 图的基本概念,图的基本术语 1 邻接点及关联边邻接点:边的两个顶点关联边:若边e= (v,u),则称顶点v、u 关联边为e 2 顶点的度、入度、
5、出度 顶点V的度 = 与V相关联的边的数目在有向图中: 顶点V的出度 = 以V为起点有向边数顶点V的入度 = 以V为终点有向边数顶点V的度 = V的出度+V的入度设图G 的顶点数为 n,边数为 e图的所有顶点的度数和 = 2*e(每条边对图的所有顶点的度数和“贡献”2度),e,13.1 图的基本概念,路径、回路无向图 G =(V,E)中的顶点序列v1,v2, ,vk,若 (vi,vi+1)E ( i=1,2, ,k-1),v=v1,u=vk,则称该序列是从顶点v到顶点u的路径;若v=u,则称该序列为回路。有向图 D =(V,E)中的顶点序列 v1,v2,vk,若 E (i=1,2,k-1),v
6、=v1,u=vk,则称该序列是从顶点v到顶点u的路径;若v=u,则称该序列为回路。,13.1 图的基本概念,例如在图G1中,V0,V1, V2,V3 是 V0 到 V3 的路径;V0,V1,V2,V3,V0 是回路。在图G2中,V0,V2,V3 是 V0 到 V3 的路径; V0,V2,V3,V0 是回路。,无向图G1,有向图G2,13.1 图的基本概念,连通图(强连通图)在无(有)向图 G=(V,E) 中,若对任何两个顶点 v、u 都存在从 v 到 u 的路径,则称G是连通图(强连通图),非连通图,连通图,强连通图,非强连通图,13.1 图的基本概念,子图设有两个图 G=(V,E),G1=(
7、V1,E1),若V1 V,E1 E,则称 G1 是 G 的子图; 例 (b)、(c) 是 (a) 的子图,(a),(b),(c),13.1 图的基本概念,连通分量(强连通分量)无向图G的极大连通子图称为G的连通分量。极大连通子图意思是:该子图是G连通子图,将G的任何不在该子图中的顶点加入,子图不再连通。,连通分图,非连通图,13.1 图的基本概念,连通分量(强连通分量)有向图D的极大强连通子图称为D的强连通分量。极大强连通子图意思是:该子图是D强连通子图,将D的任何不在该子图中的顶点加入,子图不再是强连通的。,13.1 图的基本概念,生成树包含无向图 G 所有顶点的极小连通子图称为G生成树。极
8、小连通子图意思是:该子图是G的连通子图,在该子图中删除任何一条边,子图不再连通,若T是G的生成树当且仅当T满足如下条件:T是G的连通子图T包含G的所有顶点T中无回路,连通图G1,G1的生成树,图的基本操作,顶点定位:确定顶点v在图G中的位置; 取顶点:求图G中第i个顶点的值; 求第一个邻接点:求图G中顶点v的第一个邻接点; 求下第一个邻接点:已知w为图G中顶点v的某个邻接点,求顶点w的下一个邻接点。,图的基本操作,插入顶点:在图G中增添一个顶点u为图G的第n+1个顶点,其中n为插入操作之前图G中顶点的个数; 插入边或弧:在图G中增添一条从顶点v到顶点w的边或弧; 删除顶点:从图G中删除顶点v以
9、及与顶点v相关联的边或弧; 删除边或弧:在图G中删除一条从顶点v的到顶点w边或弧。,13.1 图的基本概念图的存储结构,一、数组表示法(邻接矩阵表示) 邻接矩阵:G的邻接矩阵是满足如下条件的n阶矩阵:,在数组表示法中,用邻接 矩阵表示顶点间的关系,13.1 图的基本概念图的存储结构,二、邻接表邻接表是图的链式存储结构1、无向图的邻接表顶点:通常按编号顺序将顶点数据存储在一维数组中;关联同一顶点的边:用线性链表存储。,该结点表示边 (V2,V4),其中的4是V4在一 维数组中的位置,13.1 图的基本概念图的存储结构,边结点 Template struct Edge int dest / 表示与
10、顶点vi邻接的边上的另一个顶点在图 / 中的位置Edge *next; / 与顶点vi邻接的下一条边; 表头结点 Template struct Vertex VerType data; / 存放顶点信息Edge * link; / 指向顶点vi的第一个邻接点 ;Vertex verN;/ 定义顶点向量,N为顶点个数,无向图的邻接表的特点1)在G邻接表中,同一条边对应两个结点;2)顶点v的度:等于v对应线性链表的长度;3)判定两顶点v ,u是否邻接:要看v对应线性链表中有无对应的结点。4)在G中增减边:要在两个单链表插入、删除结点;5)设存储顶点的一维数组大小为 m(m图的顶点数n),图的边数
11、为 e,G占用存储空间为:m+2*e。G占用存储空间与G的顶点数、边数均有关。,13.1 图的基本概念图的存储结构,二、邻接表2、有向图的邻接表顶点:用一维数组存储(按编号顺序)以同一顶点为起点的弧:用线性链表存储,类似于无向图的邻接表,所不同的是: 以同一顶点为起点的弧,用线性链表存储,13.1 图的基本概念图的存储结构,二、邻接表3、有向图的逆邻接表顶点:用一维数组存储(按编号顺序)以同一顶点为终点的弧:用线性链表存储。,类似于有向图的邻接表,所不同的是: 以同一顶点为终点弧,用线性链表存储,13.1 图的基本概念图的存储结构,三、有向图的十字链表表示法,13.1 图的基本概念图的存储结构
12、,三、有向图的十字链表表示法,相同弧尾,相同弧头,13.1 图的基本概念图的存储结构,四、无向图的邻接多重表表示法,13.1 图的基本概念图的存储结构,四、无向图的邻接多重表表示法,13.1 图的基本概念图的存储结构,13.3 图的遍历,连通图的深度遍历(DFS)从图中某顶点v出发: 1)访问顶点v; 2)对v的每个未被访问的邻接点wj,从wj出发,继续对图进行深度优先遍历。,深度遍历: V1,V2,V4,V5,V8,V3,V6,V7,例,深度遍历: V1,V3,V6,V7,V2,V5,V8,V4,13.3 图的遍历,图的深度遍历(DFS),V,w1,SG1,SG2,SG3,w2,w3,w2,
13、W1、W2和W3 均为 V 的邻接点,SG1、SG2 和 SG3 分别为含顶点W1、W2和W3 的子图。,访问顶点 V : for (W1、W2、W3 )若该邻接点W未被访问,则从它出发进行深度优先搜索遍历。,13.3 图的遍历,图的深度遍历(DFS),V,w1,SG1,SG2,SG3,w2,w3,w2,从图解可见:,1. 从深度优先搜索遍历连通图的过程类似于树的先根遍历;,解决的办法是:为每个顶点设立一个 “访问标志 visitedw”。,2. 如何判别V的邻接点是否被访问?,13.3 图的遍历,非连通图的深度优先搜索遍历首先将图中每个顶点的访问标志设为 FALSE,之后搜索图中每个顶点,如
14、果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。,13.3 图的遍历,例如:,a,b,c,h,d,e,k,f,g,F F F F F F F F F,T,T,T,T,T,T,T,T,T,a,c,h,d,k,f,e,b,g,a,c,h,k,f,e,d,b,g,访问标志:,访问次序:,0 1 2 3 4 5 6 7 8,13.3 图的遍历,图的深度遍历(DFS)举例,深度遍历:V1,V3 ,V7 ,V6 ,V2 ,V4 ,V8 ,V5,13.3 图的遍历,图的广度遍历(BFS)从图的某一顶点V0出发,访问此顶点后,依次访问V0的各个未曾访问过的邻接点;然后分别从这些邻接
15、点出发,广度优先遍历图,直至图中所有已被访问的顶点的邻接点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止。,广度遍历:V1 V2 V3 V4 V5 V6 V7 V8,13.3 图的遍历,图的广度遍历(BFS)从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0有路径相通的顶点都被访问到。,若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。,13.3 图的遍历,图
16、的广度遍历(BFS)从图中某顶点v出发:1) 访问顶点v2) 访问v的所有未被访问的邻接点w1,w2,wk3) 依次从这些邻接点出发,访问它们的所有未被访问的邻接点,直到图中所有访问过的顶点的邻接点都被访问到。,V1,V2,V3,V4,V8,V5,V6,V7,V1,V3,V2,V6,V7,V4,V5,V8,13.3 图的遍历,图的广度遍历(BFS),13.3 图的遍历,图的广度遍历(BFS),13.3 图的遍历,图的广度遍历(BFS),13.4 图的连通性与最小生成树,问题提出要在n个城市间建立通信联络网顶点表示城市权城市间建立通信线路所需花费代价希望找到一棵生成树,它的每条边上的权值之和(即
17、建立该通信网所需花费的总代价)最小最小代价生成树 问题分析n个城市间,最多可设置 n(n-1)/2 条线路。n个城市间建立通信网,只需 n-1 条线路。问题转化为:如何在可能的线路中选择 n-1 条,能把所有城市(顶点)均连起来,且总耗费(各边权值之和)最小。,13.4 图的连通性与最小生成树,普里姆算法的基本思想取图中任意一个顶点 v 作为生成树的根,之后往生成树上添加新的顶点 w。在添加的顶点 w 和已经在生成树上的顶点 v 之间必定存在一条边,并且该边的权值在所有连通顶点 v 和 w 之间的边中取值最小。之后继续往生成树上添加顶点,直至生成树上含有 n-1 个顶点为止。,13.4 图的连
18、通性与最小生成树,普里姆算法(Prim)设 G=(V,GE)为一个具有 n 个顶点的连通网络,T=(U,TE)为构造的生成树。(1)初始时,U = u0,TE = ;(2)在所有 uU 、vV-U 的边(u,v)中选择一条权值最小的边,不妨设为(u,v);(3)(u,v) 加入TE,同时将 v 加入U;(4)重复(2)(3),直到 U=V 为止;,U,V-U,v,u,U扩大,V-U缩小,v,u,13.4 图的连通性与最小生成树,普里姆算法(Prim),U= V1 ,U= V1,V3 ,U= V1,V3,V6,U= V1,V3,V6,V4 ,U= V1,V3,V6,V4,V2 ,U= V1,V3
19、,V6,V4,V2,V5 ,13.4 图的连通性与最小生成树,普里姆算法的基本思想设置一个辅助数组,对当前 V-U 集中的每个顶点,记录和顶点集U中顶点相连接的代价最小的边:,struct VertexType adjvex; / U集中的顶点序号VRType lowcost; / 边的权值 closedge MAX_VERTEX_NUM ;,13.4 图的连通性与最小生成树,普里姆算法的基本思想,v1 v1 v1 0 6 1 5,v3 v3 v3 v3 0 5 0 5 6 4,U= v1 ,U= v1,v3 ,U,U,13.4 图的连通性与最小生成树,普里姆算法的基本思想,i,closedg
20、e,1 2 3 4 5 6,U,13.4 图的连通性与最小生成树,克鲁斯卡尔(Kruskal)算法考虑问题的出发点:为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能地小。,具体做法:先构造一个只含 n 个顶点的子图SG,然后从权值最小的边开始,若它的添加不使SG中产生回路,则在SG 上加上这条边,如此重复,直至加上n-1条边为止。,13.4 图的连通性与最小生成树,克鲁斯卡尔(Kruskal)算法设连通网 N = ( V, E )。令最小生成树初始状态为只有 n 个顶点而无边的非连通图 T = (V, ),每个顶点自成一个连通分量。在E中选取代价最小的边,若该边依附的顶点落
21、在 T 中不同的连通分量上,则将此边加入到 T中;否则,舍去此边,选取下一条代价最小的边。依此类推,直至T中所有顶点都在同一连通分量上为止。,13.4 图的连通性与最小生成树,克鲁斯卡尔(Kruskal)算法,有向无环图:没有回路的有向图,13.5 有向无环图及其应用,13.5.1 AOV网与拓扑排序,用顶点表示活动,边表示活动的顺序关系的有向无环图称为AOV网。 某工程可分为7个子工程,工程流程可用如下AOV网表示,V0,V1,V2,V3,V4,V5,V6,拓扑排序:由某个集合上的一个偏序得到该集合上的一个全序。 偏序:指集合中仅有部分成员之间可比较。 全序:指集合中全体成员之间均可比较。,13.5.1 AOV网与拓扑排序,1)在有向图中选一入度为0的顶点v,输出; 2)将顶点v邻接到的所有顶点的入度减1; 3)重复1)、2),直到全部顶点均已输出或有向图中不存在入度为0的顶点为止;,拓扑排序基本步骤,例: V0,V1,V2,V3,V4,V5,V6,输出 v0,有向图拓扑序列:V0,V1,V2,V3,V4,V5,V6,