950 likes | 1.08k Views
数 据 结 构. 刘家芬 Sept 2012. 第七章 图. 线性结构: 是研究数据元素之间的一对一关系。在这种结构中,除第一个和最后一个元素外,任何一个元素都有唯一的一个直接前驱和直接后继。 树结构: 是研究数据元素之间的一对多的关系。在这种结构中,每个元素对下可以有 0 个或多个元素相联系,对上只有唯一的一个元素相关,数据元素之间有明显的层次关系。 图结构: 是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,图中任意元素之间都可能相关。. 7.1 图的定义和术语.
E N D
数 据 结 构 刘家芬 Sept 2012
第七章 图 • 线性结构:是研究数据元素之间的一对一关系。在这种结构中,除第一个和最后一个元素外,任何一个元素都有唯一的一个直接前驱和直接后继。 • 树结构:是研究数据元素之间的一对多的关系。在这种结构中,每个元素对下可以有0个或多个元素相联系,对上只有唯一的一个元素相关,数据元素之间有明显的层次关系。 • 图结构:是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,图中任意元素之间都可能相关。
7.1 图的定义和术语 • 图(Graph)——图G是由两个集合V(G)和E(G)组成的,记为G=(V,E) • V(G)是顶点的非空有限集 • E(G)是边的有限集合,边是顶点对 • 有向图——有向图G是由两个集合V(G)和E(G)组成的 • V(G)是顶点的非空有限集 • E(G)是有向边(也称弧)的有限集合 • 弧是顶点的有序对,记为<v,w>,v,w是顶点,v为弧尾,w为弧头 • 无向图——无向图G是由两个集合V(G)和E(G)组成的 • V(G)是顶点的非空有限集 • E(G)是边的有限集合,边是顶点的无序对,记为(v,w)或(w,v),并且(v,w)=(w,v) V=Vertex E=Edge
2 4 5 1 3 6 G1 1 5 7 3 2 4 6 G2 图的示例 • 有向图G1 =(V,E)中: • V(G1)={1,2,3,4,5,6} • E(G1)={<1,2>, <2,1>, <2,3>, <2,4>, <3,5>, <5,6>, <6,3>} • 无向图G2=(V,E)中: • V(G2)={1,2,3,4,5,6,7} • E(G2)={(1,2),(1,3),(2,3),(2,4),(2,5),(5,6),(5,7)}
完全图 • 有向完全图——有n(n-1)条弧的n个顶点的有向图 • 无向完全图——有n(n-1)/2条边的n个顶点的无向图 • 证明:有向完全图有n(n-1)条边。 证明:若是有向完全图,则顶点1必与所有其他顶点各有2条连线,即有2(n-1)条边, 顶点2有2(n-2)条边,…,顶点n-1有2条边,顶点n有0条边。总边数=2( n-1+ n-2+…+1+0)=2(n-1+0)n/2= n(n-1) • 证明:无向完全图有n(n-1)/2 条边。 证明:若是无向完全图,则顶点1必与所有其他顶点各有1条连线,即有n-1条边,顶点2有n-2条边,…,顶点n-1有1条边,顶点n有0条边。总边数= n-1+ n-2+…+1+0=(n-1+0)n/2= n(n-1)/2
图的定义和术语 • 稀疏图——若边或弧的个数 e<nlogn则称作稀疏图,否则称稠密图。 • 权——把图的边或弧赋予一个有意义的数。 • 网——带权图: 弧或边带权的图分别称作有向网或无向网。 • 子图——如果图G(V,E)和图G’ (V’,E’),满足:V’V且E’E,则称G’为G的子图。 • 邻接点——若无向图G中存在(V,W),则称V,W互为邻接点; 边(V,W)和顶点V,W相关联。
图的定义和术语 • 顶点的度TD • 无向图中,顶点的度为与该顶点相连的边数 • 有向图中,顶点的度分成入度与出度 入度ID:以该顶点为弧头的弧的数目 出度OD:以该顶点为弧尾的弧的数目 • 在无向图中,所有顶点度的和是图中边的2倍。 即∑TD(vi)=2e,i=1, 2, …, n ,e为图的边数
A 9 15 例 例 例 11 2 2 4 4 5 5 B E 7 21 无向完全图 有向完全图 1 1 3 3 6 6 3 C F G1 2 2 2 1 3 1 3 G=(V,E) G’=(V’,E’) 例 1 5 7 图G与子图G’ 3 2 4 6 G2 5 顶点5的度:3 顶点2的度:4 顶点2入度:1 出度:3 顶点4入度:1 出度:0 3 6 有向网
2 4 5 1 3 6 简单路径: 图的定义和术语 路径: 在图 G=(V, E) 中, 若从顶点 vi 出发, 沿一些边经过一些顶点 vp1, vp2, …, vpm,到达顶点vj。则称顶点序列 ( vi vp1 vp2 ... vpm vj ) 为从顶点vi 到顶点 vj 的路径。它经过的边(vi, vp1)、(vp1, vp2)、...、(vpm, vj)应当是属于E的边。 非带权图的路径长度是指此路径上边的条数; 带权图的路径长度是指路径上各边的权之和。 路径长度: 路径上各顶点 v1,v2,...,vm均不互相重复。 回路: 若路径上第一个顶点 v1与最后一个顶点vm重合,则称这样的路径为回路或环。
2 4 5 1 3 6 G1 1 5 7 3 2 4 6 G2 路径示例 路径1→3:1 2 3 (5 6 3) 路径长度:2 (5) 简单路径:1,2,3,5 回路:1,2,3,5,6,3,1 简单回路:3,5,6,3 路径:1,2,5,7,6,5,2,3 路径长度:7 简单路径:1,2,5,7,6 回路:1,2,5,7,6,5,2,1 简单回路:1,2,3,1
连通图 • 在无向图中, 若从顶点vi到顶点vj有路径, 则称顶点vi与vj是连通的。 • 如果图中任意一对顶点都是连通的, 则称此图是连通图。 • 非连通图的连通子图叫做连通分量。
强连通图 • 在有向图中, 若对于每一对顶点vi和vj, 都存在一条从vi到vj和从vj到vi的路径, 则称此图是强连通图。 • 非强连通图的强连通子图叫做强连通分量。
图的生成树 • 假设一个连通图有 n 个顶点和 e 条边,其n 个顶点和其中 n-1 条边构成一个极小连通子图,称该极小连通子图为此连通图的生成树。 • 关于无向图的生成树的几个结论: • 一棵有n个顶点的生成树有且仅有n-1条边; • 如果一个图有n个顶点和小于n-1条边,则是非连通图 • 如果多于n-1条边,则一定有环; • 有n-1条边的图不一定是生成树。
图的生成森林 • 对非连通图,则称由各个连通分量的生成树的集合为此非连通图的生成森林。
6 a b 3 3 e 2 4 5 1 d c 带权图——网 • 带权的图称为网。网是工程上常用的一个概念,用来表示一个工程或某种流程。
图的抽象数据类型表示 ….
7.2 图的存储结构 • 图的存储结构比较复杂: • 任意顶点之间可能存在联系,无法以数据元素在存储区中的物理位置来表示元素之间的关系。 • 图中顶点的度不一样,有的可能相差很大,若按度数最大的顶点设计结构,则会浪费很多存储单元,反之按每个顶点自己的度设计不同的结构,又会难以实现 • 常用存储方式 • 图的数组存储表示——邻接矩阵 • 图的邻接表存储表示 • 有向图的十字链表存储表示 • 无向图的邻接多重表存储表示
图的数组存储表示——邻接矩阵 • 对于有n个顶点的图,用一维数组vexs[n]存储顶点信息,用二维数组A[n][n]存储顶点之间关系的信息,该二维数组称为邻接矩阵。在邻接矩阵中,以顶点在vexs数组中的下标代表顶点,邻接矩阵中的元素A[i][j]存放的是顶点i到顶点j之间关系的信息。 • 定义:设G=(V,E)是有n1个顶点的图,G的邻接矩阵A(二维数组)是具有以下性质的n阶方阵:
邻接矩阵特点 • 无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2 • 有向图邻接矩阵不一定对称;有n个顶点的有向图需存储空间为n2 • 无向图中 • 顶点Vi的度TD(Vi)是邻接矩阵A中第i行元素之和 • 有向图中, • 顶点Vi的出度是A中第i行元素之和 • 顶点Vi的入度是A中第i列元素之和
vexs ∞ 6 2 ∞ ∞ 6 a b 3 Wij 若<vi , vj>或(vi , vj)VR 6 ∞ 3 4 3 a A[i][j]= 3 e 2 4 ∞ 反之 b 5 2 3 ∞ 1 ∞ 1 c d c ∞ 4 3 ∞ 5 d ∞ 3 ∞ 5 ∞ e 网的邻接矩阵 • 网G=(V,E) 的邻接矩阵定义如下: (a) 带权无向图 (b) 顶点矩阵 (c) 邻接矩阵 无向带权图的数组存储
vexs ∞ 6 2 ∞ ∞ 6 a b 3 ∞ ∞∞∞3 a 3 e 2 4 b 5 ∞3 ∞ 1 ∞ 1 c d c ∞ 4 ∞ ∞ 5 d ∞ ∞∞ ∞ ∞ (a) 带权有向图 e (c) 邻接矩阵 (b) 顶点矩阵 带权有向图的数组存储 网的邻接矩阵 • 邻接矩阵优点:容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。 • 邻接矩阵缺点: n个顶点需要n*n个单元存储边(弧);空间效率为O(n2)。 对稀疏图而言尤其浪费空间。
图的邻接表存储表示 • 基本思想:对图的每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(有向图中指以Vi为尾的弧)。 • 每个链表附设一个表头结点。表头结点顺序存储,以便随机访问任一顶点的链表。 • 每个表结点由三个域组成:其中邻接点域adjvex指示与定点vi邻接的点在图中的位置,链域nextarc指示下一条边或弧的结点;数据域info存储和边或弧相关的信息,如权值等。
v2 v1 3 1 ^ v3 4 4 2 2 0 0 ^ ^ v4 v4 v5 4 3 3 2 1 1 ^ ^ V1 V2 3 ^ v2 v1 V1 2 1 ^ V3 0 ^ V2 ^ V4 0 ^ 3 ^ V3 v3 v4 2 ^ V4 0 ^ 邻接表示例 邻接表 • 例1 • 例2 邻接表(出边) 逆邻接表(入边) 注:邻接表不唯一,因各个边结点的链入顺序是任意的。
例3:已知某网的邻接(出边)表,请画出该网络。例3:已知某网的邻接(出边)表,请画出该网络。 80 1 64 2 5 对应于一个邻接表的图是唯一确定的
邻接表特点 • 无向图中 • 顶点Vi的度为第i个单链表中的结点数 • 有向图中 • 顶点Vi的出度为第i个单链表中的结点个数 • 顶点Vi的入度为整个单链表中邻接点域值是i的结点个数(以vi为弧头)。 • 邻接矩阵多用于稠密图的存储;而邻接表多用于稀疏图的存储
有向图的十字链表存储表示 • 十字链表(Orthogonal List)是有向图的另一种链式存储结构,是将有向图的正邻接表和逆邻接表结合起来得到的一种链表。 • 十字链表中,对应有向图的每一条弧有一个结点,对应于每个顶点也有一个结点。结点结构如下所示: • 结点各字段表示含义如下:
无向图的邻接多重表存储表示 • 邻接多重表(Adjacency Multilist)是无向图的另一种链式存储结构。 • 虽然邻接表是无向图的一种有效的存储结构,在无向图的邻接表中,一条边(v,w)的两个表结点分别初选在以v和w为头结点的链表中,涉及到边的操作不方便,例如删除一条边。 • 邻接多重表的结构和十字链表类似,每条边用一个结点表示。 • 邻接多重表中的顶点结点结构与邻接表中的顶点结构相同。
邻接多重表举例 邻接表 邻接多重表
邻接多重表与邻接表 • 区别:邻接表的同一条边用两个结点表示,而邻接多重表只用一个结点表示。 • 联系: • 除标志域外,邻接多重表与邻接表表达的信息是相同的 • 邻接多重表与邻接表的操作实现也基本相似。
7.3 图的遍历 • 图的遍历:从连通图中某一顶点出发,沿着边访遍图中所有的顶点,且使每个顶点仅被访问一次 • 图的遍历比较复杂,为什么? • 图的任意顶点可能和其余的顶点相邻接,可能在访问了某个顶点后,沿某条路径搜索后又回到原顶点。 • 解决办法:在遍历过程中记下已被访问过的顶点。设置一个辅助向量Visited[1…n](n为顶点数),其初值为0,一旦访问了顶点vi后,使Visited[i]为1或为访问的次序。 • 图的遍历算法分为深度优先搜索算法和广度优先搜索算法。
图的深度优先遍历 • 图的深度优先遍历类似树的先序遍历。 • 算法思想: 设初始状态时图中的所有顶点未被访问,则: • ⑴ :从图中某个顶点vi出发,访问vi;然后找到vi的一个邻接顶点vi1; • ⑵:从vi1出发,深度优先搜索访问和vi1相邻接且未被访问的所有顶点; • ⑶:转⑴ ,直到和vi相邻接的所有顶点都被访问为止 • ⑷ :继续选取图中未被访问顶点vj作为起始顶点,转第一步,直到图中所有顶点都被访问为止。
图的深度优先遍历示例 • 请给出图G4的深度优先遍历序列 • v1-->v2-->v4-->v8-->v5-->v3--> v6-->v7
图的广度优先遍历 • 图的广度优先遍历类似树的按层次遍历。 • 算法思想: 设初始状态时图中的所有顶点未被访问,则: • ⑴:从图中某个顶点vi出发,访问vi; • ⑵:访问vi的所有相邻接且未被访问的所有顶点vi1,vi2,…,vim; • ⑶:以vi1,vi2, …,vim的次序,以vij(1≦j≦m)依此作为vi,转⑴; • ⑷:继续选取图中未被访问顶点vk作为起始顶点,转⑴,直到图中所有顶点都被访问为止。
图的广度优先遍历示例 • 请给出图G4的广度优先遍历序列 • v1-->v2-->v3-->v4-->v5-->v6--> v7-->v8
7.4 图的连通性问题 • 对于无向图,对其进行遍历时: • 若是连通图:仅需从图中任一顶点出发,就能访问图中的所有顶点; • 若是非连通图:需从图中多个顶点出发。每次从一个新顶点出发所访问的顶点集序列恰好是各个连通分量的顶点集; 例:对下图进行深度优先遍历,得到的顶点序列为 ALMJBFC DE GKHI
连通图与生成树 • 对连通图进行遍历,得到的是什么? • 得到的将是一个极小连通子图,即图的生成树 • 由深度优先搜索得到的生成树,称为深度优先搜索生成树。 • 由广度优先搜索得到的生成树,称为广度优先生成树。 • 请画出图G4的深度优先生成树和深度优先生成树
非联通图与生成森林 • 对非连通图进行遍历,得到的是什么? • 每个连通分量中的顶点集,和遍历时走过的边一起构成若干棵生成树,这些连通分量的生成树组成非连通图的生成森林。 • 请画出下图的生成森林?
7.4.2 有向图的强连通分量 • 对于有向图,在其每一个强连通分量中,任何两个顶点都是可达的。 VG,与V可相互到达的所有顶点就是包含V的强连通分量的所有顶点。 • 设从V可到达的顶点集合为T1(G),而可到达V 的顶点集合为T2(G),则包含V的强连通分量的顶点集合是: T1(G)∩T2(G) 。
a b a a a 6 c c c b 3 5 b b e d d d f 2 f c d 4 e e f f e 1 (d) 再次深度优先遍历 (a) 有向图G (c) 图中边反向 (b) 从a出发深度优先遍历 例:求有向图G的强连通分量 • 下图是求有向图的强连通分量过程。
7.3 最小生成树 • 最小生成树在实际中具有重要用途,如设计通信网。图的顶点表示城市,边表示两个城市之间的通信线路,边的权值表示建造通信线路的费用。n个城市之间最多可以建n(n-1)/2条线路,如何选择其中的n-1条,使所有城市连通且总的建造费用最低? • 带权图的生成树中,所有边的权值之和称为生成树的代价。 • 最小生成树(Minimum Spanning Tree) :带权连通图中代价最小的生成树称为最小生成树。
最小生成树 • 构造最小生成树的算法有多种,基本原则:尽可能选取权值最小的边,但不能构成回路。 • 多数算法都利用了最小生成树的MST性质: • 设G=(V,E)是一个带权连通图,U是顶点集V的一个非空子集。若u∈U ,v∈V-U,且(u, v)是U中顶点到V-U中顶点之间权值最小的边,则必存在一棵包含边(u, v)的最小生成树。
MST性质证明 • 证明: 用反证法证明。 • 设图G的任何一棵最小生成树都不包含边(u,v)。设T是G的一棵最小生成树,从u到v必有一条路径(u,…,v)。当将边(u,v)加入到T中时就构成了回路。则路径(u, …,v)中必有一条边(u’,v’) ,其中u’∈U ,v’∈V-U 。删去边(u’,v’) 便可消除回路,同时得到另一棵生成树T’。 • 由于(u,v)是U中顶点到V-U中顶点之间权值最小的边,故(u,v)的权值不会高于(u’,v’)的权值,T’的代价也不会高于T, T’是包含(u,v) 的一棵最小生成树,与假设矛盾。