版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构课程的内容,多对多 (m:n),1,特点:非线性结构,是研究数据元素之间的多对多的关系。在这种结构中,任意两个元素之间可能存在关系。即结点之间的关系可以是任意的,图中任意元素之间都可能相关。 图的应用极为广泛,已渗入到诸如语言学、逻辑学、物理、化学、电讯、计算机科学以及数学的其它分支。,第7章 图,2,7.1 基本术语 7.2 存储结构 7.3 图的遍历 7.4 图的其他运算 7.5 图的应用,第7章 图,3,7.1 图的基本术语,图:记为 G( V, E ) 其中:V 是G的顶点集合,是有穷非空集;E 是G的边集合,是有穷集。,问:当E(G)为空时,图G存在否? 答:还存在!但此时图
2、G只有顶点而没有边。,有向图: 无向图: 完全图:,图G中的每条边都是有方向的; 图G中的每条边都是无方向的; 图G任意两个顶点都有一条边相连接;,若 n 个顶点的无向图有 n(n-1)/2 条边, 称为无向完全图 若 n 个顶点的有向图有n(n-1) 条边, 称为有向完全图,V=vertex E=edge,4,证明:, 完全有向图有n(n-1)条边。 证明:若是完全有向图,则顶点1必与所有其他顶点各有2条连线,即有2(n-1)条边, 顶点2有2(n-2)条边,顶点n-1有2条边,顶点n有0条边. 总边数2( n-1 n-210)=2(n-1+0)n/2= n(n-1),完全无向图有n(n-1
3、)/2 条边。 证明:若是完全无向图,则顶点1必与所有其他顶点各有1条连线,即有n-1条边,顶点2有n-2条边,顶点n-1有1条边,顶点n有0条边. 总边数 n-1 n-210=(n-1+0)n/2= n(n-1)/2,5,例:判断下列4种图形各属什么类型?,无向,无向图(树),有向图,有向,n(n-1)/2 条边,n(n-1) 条边,G1的顶点集合为V(G1)=0,1,2,3 边集合为E(G1)=(0,1),(0,2),(0,3),(1,2),(1,3),(2,3),完全图,完全图,6,稀疏图: 稠密图:,设有两个图 G(V, E) 和 G(V, E)。若 V V 且 E E, 则称 图G
4、是 图G 的子图。,子 图:,边较少的图。通常边数 E = 1/2TD(vi),答:是树!而且是一棵有向树!,9,生成树:是一个极小连通子图,它含有图中全部顶点,但只 有n-1条边。 如果在生成树上添加1条边,必定构成一个环。 若图中有n个顶点,却少于n-1条边,必为非连通图。 生成森林:由若干棵生成树组成,含全部顶点,但构成这些 树的边是最少的。,10,简单路径:,路径上各顶点 v1,v2,.,vm 均不互相重复。,回 路:,例:,若路径上第一个顶点 v1 与最后一个顶点vm 重合,则称这样的路径为回路或环。,路径:,在图 G(V, E) 中, 若从顶点 vi 出发, 沿一些边经过一些顶点
5、vp1, vp2, , vpm,到达顶点vj。则称顶点序列 ( vi vp1 vp2 . vpm vj ) 为从顶点vi 到顶点 vj 的路径。它经过的边(vi, vp1)、(vp1, vp2)、.、(vpm, vj)应当是属于E的边。,路径长度:,非带权图的路径长度是指此路径上 边的条数; 带权图的路径长度是指路径上各边的权之和。,11,ADT Graph 数据对象V:v是具有相同特性的数据元素的集合,称为顶点集。 数据关系R:R=VR;VR=|v,wV 且 P(v,w), 表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息 基本操作P: CreatGraph ( 初始条件:图G存在,
6、v和图中顶点有相同特征。 操作结果:在图G中添加新顶点。 (参见P156-257) ,图的抽象数据类型,注意:V 的大小写含义不同!,12,7.2 图的存储结构,图的特点:非线性结构(m :n ),邻接表 邻接多重表 十字链表,设计为邻接矩阵,链式存储结构:,顺序存储结构:,无!,(多个顶点,无序可言) 但可用数组描述元素间关系。,可用多重链表,重点介绍:,邻接矩阵(数组)表示法 邻接表(链式)表示法,13,一、邻接矩阵(数组)表示法,建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)。 设图 A = (V, E) 有 n 个顶点,则图的邻接矩阵是一个二维数组 A.Edg
7、enn,定义为:,例1:,邻接矩阵:,A.Edge =,( v1 v2 v3 v4 v5 ),v1 v2 v3 v4 v5,0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,分析1:无向图的邻接矩阵是对称的; 分析2:顶点i 的度第 i 行 (列) 中1 的个数; 特别:完全图的邻接矩阵中,对角元素为0,其余全1。,0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0,0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0,顶点表:,14,例2 :有向图的
8、邻接矩阵,分析1:有向图的邻接矩阵可能是不对称的。 分析2:顶点的出度=第i行元素之和,OD( Vi )= A.Edge i j 顶点的入度=第i列元素之和。ID( Vi )= A.Edge j i 顶点的度=第i行元素之和+第i列元素之和, 即:TD(Vi)=OD( Vi ) + ID( Vi ),邻接矩阵:,A.Edge =,( v1 v2 v3 v4 ),v1 v2 v3 v4,0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,注:在有向图的邻接矩阵中, 第i行含义:以结点vi为尾的弧(即出度边); 第i列含义:以结点vi为头的弧(即入度边)。,顶点表:,0 1 1 0 0
9、 0 0 0 0 0 0 1 1 0 0 0,0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0,15,容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。 n个顶点需要n*n个单元存储边(弧);空间效率为O(n2)。 对稀疏图而言尤其浪费空间。,特别讨论 :网(即有权图)的邻接矩阵,定义为:,以有向网为例:,邻接矩阵:, ,N.Edge =,( v1 v2 v3 v4 v5 v6 ),邻接矩阵法优点:,邻接矩阵法缺点:,顶点表:,5 7 4 8 9 5 6 5 3 1, 5 7 4 8 9 5 6 5 3 1 ,16,注:用两个数组分别存储顶点表和
10、邻接矩阵 #define INFINITY INT_MAX /最大值 #define MAX_VERTEX_NUM 20 /假设的最大顶点数 Typedef enum DG, DN, AG,AN GraphKind; /有向/无向图,有向/无向网 Typedef struct ArcCell /弧(边)结点的定义 VRType adj; /顶点间关系,无权图取1或0;有权图取权值类型 InfoType *info; /该弧相关信息的指针 ArcCell, AdjMatrix MAX_VERTEX_NUM MAX_VERTEX_NUM ; Typedef struct /图的定义 VertexT
11、ype vexs MAX_VERTEX_NUM ; /顶点表,用一维向量即可 AdjMatrix arcs; /邻接矩阵 Int Vernum, arcnum; /顶点总数,弧(边)总数 GraphKind kind; /图的种类标志 Mgraph;,图的邻接矩阵存储表示(参见教材P161),对于n个顶点的图或网,空间效率=O(n2),17,Status CreateUDN(Mgraph / CreateUDN,例:用邻接矩阵生成无向网的算法(参见教材P162),对于n个顶点e条弧的网, 建网时间效率 = O(n2+n+e*n),18,二、邻接表(链式)表示法,对每个顶点vi 建立一个单链表,
12、把与vi有关联的边的信息(即度或出度边)链接起来,表中每个结点都设为3个域;,每个单链表还应当附设一个头结点(设为2个域),存vi信息;,表结点,头结点,邻接点域,表示vi一个邻接点的位置,链域,指向vi下一个边或弧的结点,数据域,与边有关信息(如权值),数据域,存储顶点vi 信息,链域,指向单链表的第一个结点,每个单链表的头结点另外用顺序存储结构存储。,19,例1:无向图的邻接表,邻接表,例2:有向图的邻接表,邻接表(出边),逆邻接表(入边),注:邻接表不唯一,因各个边结点的链入顺序是任意的。,20,例3:已知某网的邻接(出边)表,请画出该网络。,80,64,1,2,5,当邻接表的存储结构形
13、成后,图便唯一确定!,21,分析1:对于n个顶点e条边的无向图,邻接表中除了n个头结点外,只有2e个表结点,空间效率为O(n+2e)。 若是稀疏图(en2),则比邻接矩阵表示法O(n2)省空间。,邻接表存储法的特点:,分析2:在有向图中,邻接表中除了n个头结点外,只有e个表结点,空间效率为O(n+e)。若是稀疏图,则比邻接矩阵表示法合适。,它其实是对邻接矩阵法的一种改进,怎样计算无向图顶点的度?,邻接表的缺点:,怎样计算有向图顶点的出度? 怎样计算有向图顶点的入度? 怎样计算有向图顶点Vi的度:,需遍历全表,邻接表的优点:,TD(Vi)=单链表中链接的结点个数,OD(Vi)单链出边表中链接的结
14、点数 I D( Vi ) 邻接点为Vi的弧个数,TD(Vi) = OD( Vi ) + I D( Vi ),空间效率高;容易寻找顶点的邻接点;,判断两顶点间是否有边或弧,需搜索两结点对应的单链表,没有邻接矩阵方便。,22,讨论:邻接表与邻接矩阵有什么异同之处?,1. 联系:邻接表中每个链表对应于邻接矩阵中的一行,链表中结点个数等于一行中非零元素的个数。 2. 区别: 对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。 邻接矩阵的空间复杂度为O(n2),而邻接表的空间复杂度为O(n+e)。 3. 用途:邻接矩阵多用于稠密图的存储(e接近n(
15、n-1)/2);而邻接表多用于稀疏图的存储(en2),23,图的邻接表存储表示(参见教材P163),#define MAX_VERTEX_NUM 20 /假设的最大顶点数 Typedef struct ArcNode int adjvex; /该弧所指向的顶点位置 struct ArcNode *nextarcs; /指向下一条弧的指针 InfoArc *info; /该弧相关信息的指针 ArcNode; Typedef struct VNode /顶点结构 VertexType data; /顶点信息 ArcNode * firstarc; /指向依附该顶点的第一条弧的指针 VNode, A
16、djList MAX_VERTEX_NUM ; Typedef struct /图结构 AdjList vertics ; /应包含邻接表 int vexnum, arcnum; /应包含顶点总数和弧总数 int kind; /还应说明图的种类(用标志) ALGraph; /图结构,空间效率为O(n+2e)或O(n+e) 时间效率为O(n+e*n),24,它是有向图的另一种链式结构。 思路:将邻接矩阵用链表存储,是邻接表、逆邻接表的结合。 1、每条弧对应一个结点(称为弧结点,设5个域) 2、每个顶点也对应一个结点(称为顶点结点,设3个域),顶点结点,弧结点,三、十字链表,tailvex: 弧尾
17、顶点位置 headvex: 弧头顶点位置 hlink: 弧头相同的下一弧位置 tlink: 弧尾相同的下一弧位置 info: 弧信息,n个顶点用顺序存储结构,data : 存储顶点信息。 Firstin : 以顶点为弧头的第一条弧结点。 Firstout: 以顶点为弧尾的第一条弧结点。,适用于有向图,25,#define MAX_VERTEX_NUM 20 Typedef struct ArcBox /弧结点结构 int tailvex , headvex ; struct ArcBox * hlink , tlink; InfoType *info; ArcBox; Typedef stru
18、ct VexNode /顶点结构 VertexType data; ArcBox * firstin,*firstout; VexNode; Typedef struct VexNode xlist MAX_VERTEX_NUM ; /表头向量 int vexnum, arcnum; OLGraph; /图结构,十字链表存储结构描述:,26,例:画出有向图的十字链表。,十字链表优点:容易操作,如求顶点的入度、出度等。 空间复杂度与邻接表相同;建立的时间复杂度与邻接表相同。,数组下标不属结点分量,27,这是无向图的另一种存储结构,当对边操作时,无向图应采用此种结构存储。 1、每条边只对应一个结点
19、(称为边结点),设立6个域; 2、每个顶点也对应一个结点(顶点结点),设立2个域;,边结点,四、邻接多重表,mark:标志域,如处理过或搜索过。 Ivex, jvex : 顶点域,边依附的两个顶点位置。 ilink: 指向下一条依附顶点 i 的边结点位置。 jlink: 指向下一条依附顶点 j 的边结点位置。 info: 边信息,如权值等。,n个顶点用顺序存储结构,data : 存储顶点信息。 Firstedge : 依附顶点的第一条边结点。,顶点结点,适用于无向图,28,例:画出无向图的邻接多重表,邻接多重表优点: 容易操作,如求顶点的度等。 空间复杂度与邻接表相同; 建立的时间复杂度与邻接
20、表相同。,数组下标不属结点分量,29,一、深度优先搜索 二、广度优先搜索,7.3 图的遍历,遍历定义:从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。,遍历实质:找每个顶点的邻接点的过程。 图的特点:图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。,解决思路:可设置一个辅助数组 visited n ,用来标记每个被访问过的顶点。它的初始状态为0,在图的遍历过程中,一旦某一个顶点i 被访问,就立即改 visited i为1,防止它被多次访问。,图常用的遍历:
21、,怎样避免重复访问?,30,一、深度优先搜索( DFS ),基本思想:仿树的先序遍历过程。,Depth_First Search,v1,DFS 结果,例1:,v2,v4,v8,v5,v3,v6,v7,例2:,v2 v1 v3 v5 ,DFS 结果,v4 v6,起点,起点,遍历步骤,31,深度优先搜索(遍历)步骤:,详细归纳: 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1; 再从 w1 出发,访问与 w1邻接但还未被访问过的顶点 w2; 然后再从 w2 出发,进行类似的访问, 如此进行下去,直至到达所有的邻接顶点都被访问过为止。 接着,退回一步,退到前一次刚访问过的顶
22、点,看是否还有其它没有被访问的邻接顶点。 如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问; 如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。,简单归纳: 1)访问起始点 v; 2)若v的第1个邻接点没访问过,深度遍历此邻接点; 3)若当前邻接点已访问过,再找v的第2个邻接点重新遍历。,32,讨论1:计算机如何实现DFS?,DFS 结果,邻接矩阵 A,辅助数组 visited n ,起点,v2v1v3v5v4v6,开辅助数组 visited n !,例:,33,讨论2:在图的邻接表中如何进行DFS?,v0 v1 v2 v3,DFS 结果,辅助数组
23、 visited n ,例:,照样借用visited n !,起点,0 1 2 3,注意:在邻接表中,并非每个链表元素(表结点)都被扫描到,遍历速度很快。,34,深度优先遍历图的算法: 课本P169页 Boolean visited MAX; / 访问标志数组 Status (*VisitFunc) (int v); /函数变量 Void DFSTraverse( Graph G, Status (*Visit) (int v) / 对图G做深度优先遍历 VisitFunc = Visit; / 使用全局变量VisitFunc,使DFS不必设函数指针参数 for (v=0; v V3- V6-
24、 V4- V2- V5,52,设计思路: 增设一辅助数组Closedge n , 每个数组分量都有两个域:,要求:使Colsedge i.lowcost = min( ( u ,vi ) ) u U,计算机内怎样实现Prim(普里姆)算法?,Prim算法特点: 将顶点归并,与边数无关,适于稠密网。 故采用邻接矩阵作为图的存储表示。,vi 在U中的邻点u,Colsedge i,V-U中顶点vi,u与vi之间对应的边权,从u1un中挑,53,具体示例:,算法实现参见:教材P175 算法7.9,1,2,3,4,5,6,1, 3,2, 4, 5, 6,1,3,6,2, 4,5,1,3, 6,4,2,
25、5,1,3,6,4,2,5,1,3,6,4,2,5,1,3,起点,4,6,2,4,5,2,3,5,1 2 3 4 5 6,显然, Prim算法的时间效率O(n2),54,一顶点到其余各顶点,3. 求最短路径,两种常见的最短路径问题: 一、 单源最短路径用Dijkstra(迪杰斯特拉)算法 二、所有顶点间的最短路径用Floyd(弗洛伊德)算法,典型用途:交通问题。如:城市A到城市B有多条线路,但每条线路的交通费(或所需时间)不同,那么,如何选择一条线路,使总费用(或总时间)最少? 问题抽象:在带权有向图中A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。,(注
26、:最短路径与最小生成树不同,路径上不一定包含n个顶点),任意两顶点之间,55,一、单源最短路径 (Dijkstra算法),目的: 设一有向图G=(V, E),已知各边的权值,以某指定点v0为源点,求从v0到图的其余各点的最短路径。限定各边上的权值大于或等于0。,例1:,源点,从FA的路径有4条: FA: 24 FBA: 518=23 FBCA:5+7+9=21 FDCA:25+12+9=36,又: 从FB的最短路径是哪条? 从FC的最短路径是哪条?,56,10,30,100,例2:,60,0 1 2 3 4,50,90,70,讨论:计算机如何自动求出这些最短路径?,60,57,Dijkstra
27、(迪杰斯特拉)算法,算法思想: 先找出从源点v0到各终点vk的直达路径(v0,vk),即通过一条弧到达的路径。 从这些路径中找出一条长度最短的路径(v0,u),然后对其余各条路径进行适当调整: 若在图中存在弧(u,vk),且(v0,u)+(u,vk)(v0,vk), 则以路径(v0,u,vk)代替(v0,vk)。 在调整后的各条路径中,再找长度最短的路径,依此类推。,总之,按路径“长度” 递增的次序来逐步产生最短路径,58,算法描述:,(1)设Ann为有向网的带权邻接矩阵,Aij表示弧(vi,vj )的权值,S为已找到从源点v0出发的最短路径的终点集合,它的初始状态为 v0 .辅助数组dist
28、n为各终点当前找到的最短路径的长度,它的初始值为: distiAv0 ,i /即邻接矩阵中第v0行的权值,(2)选择u,使得 distumindistw | wV-S / w是S集之外的顶点 / distu是从源点v0到S集外所有顶点的弧中最短的一条 S= S u /将u加入S集,(3)对于所有不在S中的终点w,若 distu+ Au,w distw / 即(v0,u)(u,w)(v0,w) 则修改distw为: distw distu+ Au,w,(4)重复操作(2)、(3)共n-1次,由此求得从v0到各终点的最短路径。,59,(v0,v2)+ (v2,v3)(v0,v3),S之外的当前最短
29、路径之顶点,v0,v2,v0 ,v2 ,v4,v0 ,v2 ,v4 ,v3,v0 ,v2 ,v4 ,v3 ,v5,例3:,v2,v4,v3,v5,0 1 2 3 4 5,distw,0 1 2 3 4 5,与最小生成树的不同点:路径可能是累加的!,10 v0,v2,50 v0,v4,v3,30 v0,v4,60,二、所有顶点之间的最短路径,问题的提出:已知一个各边权值均大于0的带权有向图,对每一对顶点 vi vj,希望求出vi 与vj之间的最短路径和最短路径长度。 解决思路: 可以通过调用n次Dijkstra算法来完成,但时间复杂度为O(n3)。 改进: Floyd算法(略),61,7.5 图
30、的应用,1.拓扑排序 2.求关键路径,62, AOE网(Activity On Edges)用边表示活动的网络 AOE网定义:如果在无环的带权有向图中, 用有向边表示一个工程中的活动,用边上权值表示活动持续时间,用顶点表示事件,则这样的有向图叫做用边表示活动的网络,简称 AOE。,有两种常用的活动网络( Activity Network):, AOV网(Activity On Vertices)用顶点表示活动的网络 AOV网定义:若用有向图表示一个工程,在图中用顶点表示活动,用弧表示活动间的优先关系。Vi 必须先于活动Vj 进行。则这样的有向图叫做用顶点表示活动的网络,简称 AOV。,63,一
31、. AOV网络,用途:我们经常用有向图来描述一个工程或系统的进行过程。一般来说,一个工程可以分为若干个子工程,只要完成了这些子工程,就可以导致整个工程的完成。 例:AOV网络若用于教学计划的制定,可以解决: 哪些课程是必须先修的,哪些课程是可以并行学习的。,预备知识:拓扑排序,什么叫拓扑排序?,对一个有向无环图中的顶点排成一个具有前后次序的线性序列。,64,例:,65,进行拓扑排序的方法:,输入AOV网络。令 n 为顶点个数。 在AOV网络中选一个没有直接前驱的顶点, 并输出之; 从图中删去该顶点, 同时删去所有它发出的有向边; 重复以上 2、3 步, 直到: 全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;或: 图中还有未输出的顶点,但已跳出处理循环。这说明图中还剩下一些顶点,它们都有直接前驱
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年天津商务职业学院单招职业适应性考试备考题库及答案解析
- 2026年襄阳职业技术学院单招职业适应性测试备考题库及答案解析
- 2026年唐山工业职业技术学院单招职业适应性测试备考题库及答案解析
- 2026年山东圣翰财贸职业学院单招职业适应性测试模拟试题及答案解析
- 2026年广西建设职业技术学院单招职业适应性考试模拟试题及答案解析
- 2026年广安职业技术学院单招职业适应性测试备考题库及答案解析
- 2026年景德镇陶瓷职业技术学院单招职业适应性测试备考试题及答案解析
- 2026年兰考三农职业学院单招职业适应性考试备考试题及答案解析
- 2026年湖南邮电职业技术学院单招职业适应性测试参考题库及答案解析
- 2026年重庆人文科技学院单招职业适应性考试备考试题及答案解析
- 劳动仲裁授课课件
- 新工厂工作汇报
- 山西低空经济发展现状
- 汽车电子工程师岗位面试问题及答案
- 钱乙完整版本
- HXN5型机车柴油机的结构特点柴油机84课件
- 高速公路维修施工方案与措施
- 纺织品的物理化学性质试题及答案
- 发改价格〔2007〕670号建设工程监理与相关服务收费标准
- 高空作业吊板施工方案
- 鸡舍钢结构厂房施工组织设计方案
评论
0/150
提交评论