1.64k likes | 1.76k Views
复习:树. 树的基本概念和术语 二叉树的概念及性质 二叉树的存储结构 顺序存储 链式存储 遍历二叉树 递归算法 非递归算法 线索二叉树 树的应用:哈夫曼树. 第 8 章 图. 重点内容. 图的定义和术语 图与线性表、树形结构的关系 图的表示 术语:基本术语, [ 特别注意:弧尾,弧头,有序,无序 ] 三种关系:图与网,顶点与边的数目,图与树、森林 图的存储结构 顺序存储:数组表示法 链表存储:邻接表,多重链表表示法,十字链表,邻接多重表 掌握: 存储结构的存储方式,各种操作的实现思想 各种存储结构的特点和优势 图的遍历:深度优先,广度优先.
E N D
复习:树 • 树的基本概念和术语 • 二叉树的概念及性质 • 二叉树的存储结构 • 顺序存储 • 链式存储 • 遍历二叉树 • 递归算法 • 非递归算法 • 线索二叉树 • 树的应用:哈夫曼树
重点内容 图的定义和术语 • 图与线性表、树形结构的关系 • 图的表示 • 术语:基本术语,[特别注意:弧尾,弧头,有序,无序] • 三种关系:图与网,顶点与边的数目,图与树、森林 图的存储结构 • 顺序存储:数组表示法 • 链表存储:邻接表,多重链表表示法,十字链表,邻接多重表 • 掌握: • 存储结构的存储方式,各种操作的实现思想 • 各种存储结构的特点和优势 • 图的遍历:深度优先,广度优先
8.1 图的基本概念 • 图的定义(P135) • 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E)其中:G表示一个图,V(vertex)是图G中顶点的集合,E(edge)是图G中顶点之间边的集合。 即:V = { x | x 某个数据对象}是顶点的有穷非空集合; E = {(x, y) | x, y V } 是顶点之间关系的有穷集合,也叫做边(edge)集 合。例如:E={ <A,B>,<C,D>,<A.D>,<B,C>}
V2 V1 V3 V5 V4 V1 V2 V4 V3 8.1 图的逻辑结构 若顶点vi和vj之间的边没有方向,则称这条边为无向边,表示为(vi,vj)。 如果图的任意两个顶点之间的边都是无向边,则称该图为无向图undigraph。 若从顶点vi到vj的边有方向,则称这条边为有向边,表示为<vi,vj>。 如果图的任意两个顶点之间的边都是有向边,则称该图为有向图digraph。
V2 V1 V2 V1 V4 V3 V3 8.1 图的逻辑结构 • 图的基本术语(P136-137) • 无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。 • 有向完全图:在有向图中,如果任意两个顶点之间都存在方向相反的两条弧,则称该图为有向完全图。
图的分类 • 着眼点:存储结构的选择。
8.1 图的逻辑结构 • 图的基本术语(续) • 顶点的度:在无向图中,顶点v的度是指依附于该顶点的边数,通常记为TD (v)。 • 顶点的入度:在有向图中,顶点v的入度是指以该顶点为弧头的弧的数目,记为ID (v); • 顶点的出度:在有向图中,顶点v的出度是指以该顶点为弧尾的弧的数目,记为OD (v)。
2 V1 V2 7 5 8 V4 V3 8.1 图的逻辑结构 • 图的基本术语(续) • 权:是指对边赋予的有意义的数值量。 • 网:边上带权的图,也称网图。
V2 V1 V3 V5 V4 8.1 图的逻辑结构 • 图的基本术语(续) • 路径:着眼点:顶点间的联系。 V1 到V4的路径: V1 V4 V1 V2 V3 V4 V1 V2 V5V3 V4 • 一般情况下,图中的路径不惟一。
V2 V1 V3 V5 V4 8.1 图的逻辑结构 • 图的基本术语(续) • 路径长度: • 非带权图——路径上边的个数 • 带权图——路径上各边的权之和 V1 V4:长度为1 V1 V2 V3 V4 :长度为3 V1 V2 V5V3 V4 :长度为4
V2 V1 V3 2 V5 V4 3 5 8 2 6 8.1 图的逻辑结构 • 图的基本术语(续) • 路径长度: • 非带权图——路径上边的个数 • 带权图——路径上各边的权之和 V1 V4:长度为8 V1 V2 V3 V4 :长度为7 V1 V2 V5V3 V4 :长度为15
V2 V1 V3 V5 V4 V1 V2 V4 V3 8.1 图的逻辑结构 • 图的基本术语(续) • 回路(环):第一个顶点和最后一个顶点相同的路径。 • 简单路径:序列中顶点不重复出现的路径。 • 简单回路(简单环):除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路。
V2 V2 V1 V1 V3 V5 V4 V3 V1 V4 V5 V3 V4 8.1 图的逻辑结构 • 图的基本术语(续) • 子图:若图G=(V,E),G'=(V',E'),如果V'V且E'E ,则称图G'是G的子图。
8.1 图的逻辑结构 • 图的基本术语(续) • 连通图:在无向图中,如果从一个顶点vi到另一个顶点vj(i≠j)有路径,则称顶点vi和vj是连通的。如果图中任意两个顶点都是连通的,则称该图是连通图。 • 连通分量:非连通图的极大连通子图称为连通分量。 1.含有极大顶点数; 2. 依附于这些顶点的所有边。
8.1 图的逻辑结构 • 图的基本术语(续) • 强连通图:在有向图中,对图中任意一对顶点vi和vj(i≠j),若从顶点vi到顶点vj和从顶点vj到顶点vi均有路径,则称该有向图是强连通图。 • 强连通分量:非强连通图的极大强连通子图。
8.1 图的逻辑结构 • 图的基本术语(续) • 生成树:n个顶点的连通图G的生成树是包含G中全部顶点的一个极小连通子图。 • 生成森林:在非连通图中,由每个连通分量都可以得到一棵生成树,这些连通分量的生成树就组成了一个非连通图的生成森林。 多——构成回路 少——不连通 含有n-1条边
考研真题一 1.图中有关路径的定义是( )。【北方交通大学 2001 一、24 (2分)】 A.由顶点和相邻顶点序偶构成的边所形成的序列 B.由不同顶点所形成的序列 C.由不同边所形成的序列 D.上述定义都不是 2.设无向图的顶点个数为n,则该图最多有( )条边。 A.n-1 B.n(n-1)/2 C. n(n+1)/2 D.0 E.n2 【清华大学 1998 一、5 (2分)】【西安电子科技大 1998 一、6 (2分)】【北京航空航天大学 1999 一、7 (2分)】 3.一个n个顶点的连通无向图,其边的个数至少为( )【浙江大学 99 四、4 (4分)】 A.n-1 B.n C.n+1 D.nlogn;
考研真题一 4.要连通具有n个顶点的有向图,至少需要( )条边。【北航 2000 一、6(2分)】 A.n-l B.n C.n+l D.2n 5.n个结点的完全有向图含有边的数目( )。【中山大学 1998 二、9 (2分)】 A.n*n B.n(n+1) C.n/2 D.n*(n-l) 6.一个有n个结点的图,最少有( )个连通分量,最多有( )个连通分量。【北邮 2000 二、5 (20/8分)】 A.0 B.1 C.n-1 D.N 7.在一个无向图中,所有顶点的度数之和等于所有边数( )倍,在一个有向图中,所有顶点的入度之和等于所有顶点出度之和的( )倍。【哈工大01 (2分)】 A.1/2 B.2 C.1 D.4
考研真题一 • 1.判断一个无向图是一棵树的条件是______。 • 2.有向图G的强连通分量是指______。【北京科技大学 1997 一、7】 • 3.一个连通图的______是一个极小连通子图。【重庆大学 2000 一、1】 • 4.具有10个顶点的无向图,边的总数最多为______。【华中理工大学 2000 一、7 (1分)】 • 5.若用n表示图中顶点数目,则有_______条边的无向图成为完全图。【燕山大学1998 一、6(1分)】
考研真题一 证明:具有n个顶点n-1条边的无向连通图是自由树,即没有确定根结点的树,每个结点均可当根。若边数多于n-1条,因一条边要连接两个结点,则必因加上这一条边而使两个结点多了一条通路,即形成回路。形成回路的连通图不再是树(在图论中树定义为无回路的连通图)。 1.(1).如果G1是一个具有n个顶点的连通无向图,那么G1最多有多少条边?G1最少有多少条边? (2).如果G2是一个具有n个顶点的强连通有向图,那么G2最多有多少条边?G2最少有多少条边? (3).如果G3是一个具有n个顶点的弱连通有向图,那么G3最多有多少条边?G3最少有多少条边? 【复旦大学 1997 一(9分)】 4.证明:具有n个顶点和多于n-1条边的无向连通图G一定不是树。【东南大学 1993 四(10分)】
8.2 图的存储结构及实现 • 是否可以采用顺序存储结构存储图? • 图的特点:顶点之间的关系是m:n,即任何两个顶点之间都可能存在关系(边),无法通过存储位置表示这种任意的逻辑关系,所以,图没有顺序映象的存储结构。但可以借助数组的数据类型表示元素之间的关系。 • 如何存储图? • 考虑图的定义,图是由顶点和边组成的,分别考虑如何存储顶点、如何存储边。
1 若(vi, vj)∈E(或<vi, vj>∈E) 0 其它 edges[i][j]= 8.2 图的存储结构及实现——邻接矩阵 • 1. 邻接矩阵(数组表示法) • 基本思想:用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系(图的顺序存储) • 假设图G=(V,E)有n个顶点,则邻接矩阵是一个n×n的方阵,定义为:
邻接矩阵的结构型定义 引用: Mgraph g; a=g.n Typedef struct { Int no; //顶点编号 Char info; //顶点其他信息 }vertextype; //一维数组存储图中顶点的信息 Typedef struct { Int edge[maxsize][maxsize]; //二维数组存储各顶点之间的邻接关系,边的关系用顶点的有序对表示 Int n,e; // n顶点数和 e边数 Vertextype vex[maxsize]; //存放结点信息 }MGraph;//边、结点共同表示出图的结构
V1 V2 V3 V4 vexs= V4 V1 V1 V2 V3 V4 V1 V2 V3 V4 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 edges= V3 V2 无向图的邻接矩阵的特点? 8.2 图的存储结构及实现——邻接矩阵 无向图的邻接矩阵 主对角线为 0 且一定是对称矩阵。
V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V3 V4 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 edges= 如何求顶点i的度? 8.2 图的存储结构及实现——邻接矩阵 无向图的邻接矩阵 V4 V1 V3 V2 邻接矩阵的第i行(或第i列)非零元素的个数。
V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V3 V4 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 edges= 如何判断顶点 i 和 j 之间是否存在边? 8.2 图的存储结构及实现——邻接矩阵 无向图的邻接矩阵 V4 V1 V3 V2 测试邻接矩阵中相应位置的元素edges[i][j]是否为1。
V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V3 V4 0 1 0 1 1 0 1 1 0 1 0 0 1 1 0 0 edges= 如何求顶点 i 的所有邻接点? 8.2 图的存储结构及实现——邻接矩阵 无向图的邻接矩阵 V4 V1 V3 V2 将数组中第 i行元素扫描一遍,若edges[i][j]为1,则顶点 j为顶点 i 的邻接点。
V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V1 V2 V3 V4 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 edges= 有向图的邻接矩阵一定不对称吗? V4 V3 8.2 图的存储结构及实现——邻接矩阵 有向图的邻接矩阵 不一定,例如有向完全图。
V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V1 V2 V3 V4 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 edges= 如何求顶点 i 的出度? V4 V3 8.2 图的存储结构及实现——邻接矩阵 有向图的邻接矩阵 邻接矩阵的第 i 行元素之和。
V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V1 V2 V3 V4 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 edges= 如何求顶点 i 的入度? V4 V3 8.2 图的存储结构及实现——邻接矩阵 有向图的邻接矩阵 邻接矩阵的第 i 列元素之和。
V1 V2 V3 V4 vexs= V1 V2 V3 V4 V1 V2 V1 V2 V3 V4 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 edges= 如何判断从顶点 i 到顶点 j 是否存在边? V4 V3 8.2 图的存储结构及实现——邻接矩阵 有向图的邻接矩阵 测试邻接矩阵中相应位置的元素edges[i][j]是否为1。
wij若(vi, vj)∈E(或<vi, vj>∈E) 0 若i=j ∞ 其他 edges[i][j]= 2 0 2 5 ∞ ∞ 0 ∞∞ ∞ ∞ 0 8 7 ∞ ∞ 0 V1 V2 7 5 edges= 8 V4 V3 8.2 图的存储结构及实现——邻接矩阵 网图的邻接矩阵可定义为:
邻接矩阵的结构型定义 引用: Mgraph g; a=g.n Typedef struct { Int no; //顶点编号 Char info; //顶点其他信息 }vertextype; //一维数组存储图中顶点的信息 Typedef struct { Int edge[maxsize][maxsize]; //二维数组存储各顶点之间的邻接关系,边的关系用顶点的有序对表示 Int n,e; // n顶点数和 e边数 Vertextype vex[maxsize]; //存放结点信息 }MGraph;//边、结点共同表示出图的结构
8.2 图的存储结构及实现——邻接表 • 2. 邻接表 • 邻接表存储的基本思想:对于图的每个顶点vi,将所有邻接于vi的顶点链成一个单链表,称为顶点vi的边表(对于有向图则称为出边表),所有边表的头指针和存储顶点信息的一维数组构成了顶点表。
data firstedge adjvex nextedge 8.2 图的存储结构及实现——邻接表 邻接表有两种结点结构:顶点表结点和边表结点。 顶点表 边 表 data:数据域,存放顶点信息。 firstedge:指针域,指向边表中第一个结点。 adjvex:邻接点域,边的终点在顶点表中的下标。 nextedge:指针域,指向边表中的下一个结点。
8.2 图的存储结构及实现——邻接表 Typedef struct arcNode { Int adjvex; // 边指向的结点的位置 Struct ArcNode *nextarc; // 指向下一条边的指针 Int info; //边的相关信息,如权重 }ArcNode; // 边表,以链表的形式存储 Typedef struct VNode{ Char data; // 顶点的信息 arcNode *firstarc; //指向第一条边的指针 }VNode; // 顶点表,通常以顺序结构的形式存储 Typedef struct { VNode adjlist[maxsize]; // 邻接表 Int n,e; // 图中顶点数n 和边数 e }AGraph; // 图的邻接表类型
V4 V1 V3 V2 data firstedge 0 1 2 3 V1 1 3 ∧ V2 0 2 3 ∧ 边表中的结点表示什么? V3 1 ∧ V4 0 1 ∧ 无向图的邻接表 每个结点对应图中的一条边, 邻接表的空间复杂度为O(n+e)。
V4 V1 V3 V2 data firstedge 0 1 2 3 V1 1 3 ∧ V2 0 2 3 ∧ 如何求顶点 i 的度? V3 1 ∧ V4 0 1 ∧ 无向图的邻接表 顶点i的边表中结点的个数。
如何判断顶点 i 和顶点 j 之间是否存在边? V4 V1 V3 V2 data firstedge 0 1 2 3 V1 1 3 ∧ V2 0 2 3 ∧ V3 1 ∧ V4 0 1 ∧ 无向图的邻接表 测试顶点 i 的边表中是否存在终点为 j 的结点。
V1 V2 data firstedge 0 1 2 3 V1 1 2 ∧ V2 ∧ 如何求顶点 i 的出度? V3 3 ∧ V4 V3 V4 0 ∧ 有向图的邻接表 顶点 i 的出边表中结点的个数。
V1 V2 data firstedge 0 1 2 3 V1 1 2 ∧ V2 ∧ 如何求顶点 i 的入度? V3 3 ∧ V4 V3 V4 0 ∧ 有向图的邻接表 各顶点的出边表中以顶点 i 为 终点的结点个数。
V1 V2 data firstedge 0 1 2 3 V1 1 2 ∧ V2 ∧ 如何求顶点 i 的所有邻接点? V3 3 ∧ V4 V3 V4 0 ∧ 有向图的邻接表 遍历顶点 i 的边表,该边表中的所有终点都是顶点 i 的邻接点。
data firstedge 0 1 2 3 2 1 V1 5 2 ∧ V2 ∧ 2 V3 8 3 ∧ V4 V1 V2 7 0 ∧ 7 5 8 V4 V3 网图的邻接表
V1 V2 v1 0 1 2 3 1 2 ∧ v2 邻接表 ∧ v3 3 ∧ v4 0 1 ∧ V4 V3 v1 0 1 2 3 3 ∧ v2 0 3 ∧ v3 逆邻接表 0 ∧ v4 2 ∧ 8.2 图的存储结构及实现——邻接表 为了便于确定顶点的入度或以顶点vi为头的弧,可以建立一个有向图的逆邻接表。对每个顶点建立一个链接以vi为头的弧的表。
考研真题二: 12. 从邻接阵矩可以看出,该图共有(①)个顶点;如果是有向图该图共有(②) 条弧;如果是无向图,则共有(③)条边。【中科院软件所 1999 六、2(3分)】 • ①.A.9 B.3 C.6 D.1 E.以上答案均不正确 • ②.A.5 B.4 C.3 D.2 E.以上答案均不正确 • ③.A.5 B.4 C.3 D.2 E.以上答案均不正确 13.当一个有N个顶点的图用邻接矩阵A表示时,顶点Vi的度是( )。【南京理工大学1998一、4(2分)】
作业四、考研真题二 • 9.有向图的邻接表存储如下:(1).画出其邻接矩阵存储;(2).写出图的所有强连通分量;(3).写出顶点a到顶点i的全部简单路径。【东北大学 1997 一、5 (5分)】
十字链表 • 2.4.1 结构图:将邻接表、逆邻接表合二为一。主要用于表示有向图。 • 和稀疏矩阵的十字链表结构相比:本质一样。 • 细节差别在于:行头表和列头表合并为了顶点表。
A E D C B 十字链表 • 等价结构: