收藏 分享(赏)

数据结构第9章图.ppt

上传人:hskm5268 文档编号:7011073 上传时间:2019-04-30 格式:PPT 页数:58 大小:1.70MB
下载 相关 举报
数据结构第9章图.ppt_第1页
第1页 / 共58页
数据结构第9章图.ppt_第2页
第2页 / 共58页
数据结构第9章图.ppt_第3页
第3页 / 共58页
数据结构第9章图.ppt_第4页
第4页 / 共58页
数据结构第9章图.ppt_第5页
第5页 / 共58页
点击查看更多>>
资源描述

1、图的基本概念 图的存储表示 图的遍历 图的应用,第9章 图,图的基本概念,图(Graph) 图是由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构:Graph( V, E ) 其中:V = x | x 某个数据对象是顶点的有穷非空集合;E = (x, y) | x, y V 或 E = | x, y V是顶点之间关系的有穷集合。,无向图,有向图,V=1, 2, 3, 4, 5, 6 E=(1, 2), (1, 5), (1,6),(2, 3), (2, 4), (3, 4), (4, 5), (4, 6)(边),V= a, b, c, d E= , , (弧),ADT Graph

2、数据对象:D=ai|1i n, n 0, ai属Elemtype类型数据关系:R1=| ai ,aj D, 1i n, 1j n,每个元素可以有多个直接前驱和可以有多个直接后继基本运算:InitGraph(t);ClearGraph(t);DSF(t);BSF(t);,抽象数据类型数的定义,完全图 若有 n 个顶点的无向图有 n(n-1)/2 条边, 则此图为完全无向图。有 n 个顶点的有向图有n(n-1) 条边, 则此图为完全有向图。,邻接顶点 如果 (u, v) 是 E(G) 中的一条边,则称 u 与 v 互为邻接顶点。 例:存在(1, 2),则顶点1与2互为邻接点。存在, 则顶点a与b互

3、为邻接点。,顶点的度 一个顶点v的度是与它相关联的边的条数。记作TD(v)。,在有向图中,顶点的度=入度+出度。 顶点 v 的入度 是以 v 为终点的有向边的条数, 记作 ID(v); 顶点 v 的出度 是以 v 为始点的有向边的条数, 记作 OD(v)。 TD(v)=ID(v)+OD(v),例:TD(1)=3 TD(4)=4 TD(5)=2,例:TD(b)=ID(b)+OD(b) TD(d)=ID(d)+OD(d),=2+1=3,=2+3=5,子图 设有两个图 G(V, E) 和 G(V, E)。若 V V 且 EE, 则称 图G 是 图G 的子图。,子图,权 某些图的边具有与它相关的数,

4、称为权。这种带权图叫做网络。,任意图都是其自身子图,路径 在图 G(V, E) 中, 若从顶点 vi 出发, 沿一些边经过一些顶点 vp1, vp2, , vpm,到达顶点vj。则称顶点序列 (vi vp1 vp2 . vpm vj) 为从顶点vi 到顶点 vj 的路径。,例:V1到V3的路径:123 、123423、16423、1544,路径长度 非带权图的路径长度是指此路径上边的条数。带权图的路径长度是指路径上各边的权之和。,简单路径 若路径上各顶点 v1,v2,.,vm 均不 互相重复, 则称这样的路径为简单路径。,回路 若路径上第一个顶点 v1 与最后一个顶点vm 重合, 则称这样的路

5、径为回路或环。,路径长度: 2 、 5 、 4 、 3 ,连通图与连通分量 在无向图中, 若从顶点v1到顶点v2有路径, 则称顶点v1与v2是连通的。如果图中任意一对顶点都是连通的, 则称此图是连通图。非连通图的极大连通子图叫做连通分量。,生成树 一个连通图的生成树是其极小连通子图。n个顶点、n-1条边、连通子图。,连通图,非连通图,两个连通分量,强连通图与强连通分量 在有向图中, 若对于每一对顶点vi和vj, 都存在一条从vi到vj和从vj到vi的路径, 则称此图是强连通图。非强连通图的极大强连通子图叫做强连通分量。,强连通图,非强连通图,两个强连通分量,图的存储表示,邻接矩阵 (Adjac

6、ency Matrix),aij=,a b c d e f,0 1 0 0 1 1 1 0 1 1 0 0 0 1 0 1 0 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 0 1 0 0,利用数组vertex 存储顶点,基本思想:利用矩阵A表示顶点之间的关系,无向图的邻接矩阵是对称矩阵,aij=,8 1 9 3 4 1123,a b c d,1,1,1,1,1,1,1,4 8 219 67 310,4,19,8,2,6,3,3,10,7,邻接矩阵所占存储空间与顶点数成正比,但图中有无关系都分配存储空间,边的插入和删除不影响存储空间大小,0,1,0,0,?求顶点的度,邻接矩阵的数

7、据类型,typedef struct int no;InfoType info; VertexTtype typedef struct int edgesMAXVMAXV; /*各顶点之间的关系或权值*/int n,e; /*顶点数,边(或弧)的个数*/VertexType vexsMAXV; /*存储顶点元素*/MGraph;,建立邻接矩阵 *邻接矩阵初始化(置0或 ),*输入顶点数,弧数 ga-n ga-e *输入各顶点信息存入ga-vexs *输入各边信息(或权值)存入ga-edages ,邻接表 (Adjacency List),基本思想:在无向图中,将依附于某个顶点的所有边(边结点)

8、以单链表形式链接,每个链表设立一个表头结点。,a b c d e f,(a, b) (a,e) (a, f ),2,5,6,(b, a) (b,c) (b, d),1 3 4,(c, b) (c,d),2 4,(d, b) (d,c) (d, e) (d, f ),2 3 5 6,(e, a) (e,d),( f, a) ( f,d),1 4,1 4,4 8 219 67 310,4 8 19,8 7,4 2 6,3 6 10 7,2 3,19 10,注:在无向图中每个边生成两个结点 ?插入和删除,(d,f )=(f,d),? 求顶点的度,邻接表:在有向图中,将以该顶点作为弧尾顶点的所有弧链接

9、成单链表。,a b c d,2 8 4 7,4 9,1 3,1 5 2 11 3 13,逆邻接表: 在有向图中,将以该顶点作为弧头顶点的所有弧链接成单链表。,?求顶点的度,邻接表的结点结构和数据类型,typedef struct ANode int adjvex; /*邻接点存储序号*/InfoType info; /*若是网络存储权值*/struct ANode *nextarc; /*指向下一个边结点*/ ArcNode;,typedef struct Vertex data; /*存储顶点元素*/ArcNode *firstarc; /*指向依附于该顶点的第一边*/ VNode; typ

10、edef VNode AdjListMAXV; typedef struct AdjList adjlist;int n,e; ALGraph;,建立邻接表 *邻接表初始化(置各单链表为空表 ga.firstarc=NULL) *输入各顶点信息存入 ga.data *输入各边信息,生成新结点,插入相应的单链中。,邻接表的基本操作,插入: ,*确定单链表,*生成新结点,6,*头插链表,注:有向图只插入(或删除)一个结点,而无向图需插入(或删除)两个结点。,删除: ,*确定结点,*删除结点,*释放结点,十字链表(有向图),typedef struct ArcNode int tailvex,hea

11、dvex;struct ArcNode *hlink,*tlink;InfoType info; ArcNode;,typedef struct VexNode VertexType data;ArcNode *firstin,*firstout; VexNode;,十字链表的数据类型,邻接多重表(无向图),typedef struct ENode int mark;int ivex,jvex;struct ENode *ilink,*jlink;InfoType info; ENode;,邻接多重表的数据类型,typedef struct VNode VertexType data;ENod

12、e *firstedge; VNode;,图的遍历 ( Graph Traversal ),图的遍历从图中某一顶点出发,沿着一 些边访遍图中所有的顶点,且使每个顶点仅被访问一次。,为了避免重复访问,设置一个的辅助数组 visited 标志各顶点是否被访问过。,图的遍历的分类: 深度优先搜索 DFS (Depth First Search) 广度优先搜索 BFS (Breadth First Search),深度优先搜索DFS (Depth First Search),DFS基本思想: *访问顶点v0。 *依次从v0未被访问的邻接点出发进行深度优先搜索遍历。,遍历序列:,1,2,5,6,4,1,

13、2,4,2,6,5,1,7,3,8,3,3,7,8,0 0 0 0 0 0 0 0,1,1,1,1,1,1,1,1,注:访问v0的邻接点与访问v0方法一样,用递归方式实现。,DFS(v0)的主要步骤: (1)访问顶点v0 (2)确定第一邻接点w (3)若w未访问,则从w出发进行遍历DFS(w) (4)确定下一个邻接点w (5)重复(3)(4) 直到所有邻接点都处理结束,DFS(v0)的主要步骤: (1)访问顶点v0 (2)确定第一邻接点w (3)若w未访问,则从w出发进行遍历DFS(w) (4)确定下一个邻接点w (5)重复(3)(4) 直到所有邻接点都处理结束,深度优先搜索DFS (Dept

14、h First Search),DFS(v0) visite(v0);visitedv0=1;w=FIRST(v0);while( 存在w) if (visitedw=0)DFS(w);w=NEXT(v0,w); ,DFS(v0) visite(v0);visitedv0=1;w=FIRST(v0);while( 存在w) if (visitedv0=0)DFS(w);w=NEXT(v0,w); ,第一邻接点:p= G-adjlistv.firstarc,下一个邻接点:p=p-nextarc,广度优先搜索 BFS (Breadth First Search),BFS基本思想: *访问顶点v0。

15、 *依次访问v0未被访问的邻接点*依次从这些邻接点出发进行广度优先搜索遍历。,注:为了从已访问的邻接点出发,设置队列保存结点,遍历序列:1 2 3 4 5 7 8 6,1,2,2,2,3,3,3,4,4,4,5,5,5,7,7,7,8,8,8,队列,0 0 0 0 0 0 0 0,6,6,6,1,1,1,1,1,1,1,1,1,1,BFS(v0)的主要步骤: (1)访问顶点v0 (2)顶点v0入队列 (3)取出队头v确定第一邻接点w若w未访问,则访问w,w入队列。确定下一个邻接点w重复直到所有邻接点都处理 (4)重复(3)直到队列空。,广度优先搜索BFS (Breadth First Sear

16、ch),BFS(v0) init(Q); visite(v0); visitedv0=1;enqueue(Q,v0);while(!empty(Q) ) v=dequeue(Q);w=FIRST(v);while( 存在w) if (visitedw=0) visite(w); visitedw=1;enqueue(Q,w);w=NEXT(v,w); ,BFS(v0) init(Q); visite(v0); visitedv0=1;enqueue(Q,v0);while(!empty(Q) ) v=dequeue(Q);w=FIRST(v);while( 存在w) if (visitedw=

17、0) visite(w); visitedw=1;enqueue(Q,w);w=NEXT(v,w); ,第一邻接点:p=G-adjlistv.firstarc,下一个邻接点:p=p-nextarc,深度优先搜索DFS ( Depth First Search ),深度优先搜索过程的示例,1,2,3,4,5,6,7,9,1,2,3,4,5,6,7,8,8,9,深度优先搜索过程,深度优先生成树,广度优先搜索BFS ( Breadth First Search ),广度优先搜索的示例,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,广度优先搜索过程,广度优先生成树,问题:当对

18、非连通图遍历时, 从图中某一顶点出发, 利用深度优先搜索算法或广度优先搜索算法不可能遍历到图中的所有顶点, 只能访问到该顶点所在的最大连通子图(连通分量)的所有顶点。,非连通无向图,要实现任意图的遍历,则要扫描图中的所有顶点。,TRQVER( ) for( i=1;i=n;i+)visitedi=0;for( i=1;i=n;i+) if (visitedi=0 )DFS(vi); ,TRQVER( ) for( i=1;i=n;i+)visitedi=0;for( i=1;i=n;i+) if (visitedi=0 )BFS(vi); ,非连通图的连通分量,对于非连通的无向图,所有连通分量

19、的生成树组成了非连通图的生成森林。,非连通图的连通分量,深度优先搜索遍历,广度优先搜索遍历,遍历序列:123456,遍历序列:125634,连通图,生成树,不同的遍历得到不同的生成树,权值之和:20,权值之和:14,最小生成树 ( minimum cost spanning tree ),最小生成树-在一个连通网得到的所有生成树中, 权值之和最小的生成树称为最小生成树.,使用且仅使用该网络中的n-1 条边来联结网络中的 n 个必须顶点; 不能使用产生回路的边; 各边上的权值的总和达到最小。,应用:在若干个城市中建立通讯网。,MST性质:设G=(V,E)是一个连通网络,U是顶点集V的一个子集。若

20、(u,v)是G中所有的一个端点在U(即uU)里,另一个端点不在U(即v V-U)里的边中,具有最小权值的一条边,则一定存在G的一棵最小生成树包含此边(u,v)。,U,V-U,反正法证明:假设G中任何一棵最小生成树中都不包含边(u,v)。,设T是一棵最小生成树,不包(u,v),一定要包含一条边(u,v)。,若用(u,v)取代(u,v)得到一棵新的生成树T, 由于W (u,v) W(u,v),则T的权T的权,与假设矛盾。,6,5,1,6,4,3,2,5,普里姆(Prim)算法,基本思想:设连通网络 N = (V, E ) ,最小生成树T=(U,TE) (1)初始状态:U=v0, TE=。 (2)选

21、择满足MST性质的一条边(u, v),其中uU,v V-U,且边(u, v)的权值最小。 (3)吸收vU, 吸收(u, v)TE。 (4)重复(2)(3),直到U=V。,5,4,0,5,3,2,1,4,cost ,0 6 1 5 ,0 0 0 0 0 0,最小,5,5,4,0,最小,2,2,2,最小,最小,2,0,5,0,0,3,4,0 1 2 3 4 5,cost :利用邻接矩阵法存储图i=j: costij=0,closest 和lowcost 分别存储顶点序号和权值, 当lowcosti=0: 顶点i已经吸收到U。 当lowcosti0: 顶点i未被吸收V-U。当0lowcosti:存储

22、顶点i与顶点closesti之间的权值。 当lowcosti=: 顶点i未与已吸收的顶点之间没有关系(边)。,克鲁斯卡尔 (Kruskal) 算法,基本思想:设有有 n 个顶点的连通网络 N = V, E , 最初先构造一个只有 n 个顶点, 没有边的非连通图 T = V, , 图中每个顶点自成一个连通分量。当在 E 中选到一条具有最小权值的边时, 若该边的两个顶点落在不同的连通分量上,则将此边加入到 T 中; 否则将此边舍去,重新选择一条权值最小的边。如此重复下去, 直到所有顶点在同一个连通分量上为止。,回路,最短路径 (Shortest Path),最短路径问题:从图中某一顶点(称为源点)

23、到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。 问题解法: 边上权值非负情形的单源最短路径问题 Dijkstra算法 边上权值为任意值的单源最短路径问题 Bellman和Ford算法 所有顶点之间的最短路径 Floyd算法,2,1.2-10,1.3-2,arrive,1.3.4-4,1.3.6-13,1.3.4.5-8,1.3.4.6-10,15: path=1345 length=8,arrive,1.3.4.5.7-15,14: path=134 length=4,1.3.4.5.2-9,12: path=13452 length=9,

24、13: path=13 length=2,arrive,16: path=1346 length=10,arrive,1.3.4.6.7-13,17: path=13467 length=13,arrive,arrive,算法思想: 首先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从顶点v到其它各顶点的最短路径全部求出为止。,Dijkstra算法,2,1.2-10,1.3-2,arrive,1.3.4-4,1.3.6-13,1.3.4.5-8,1.3.4.6-10,arrive,1.3.4.5.7-15,1.3.4.5.2-9,arrive,arrive,1.

25、3.4.6.7-13,arrive,arrive,1 0 0 0 0 0 0,Si=0 未到达 Si=1 已到达,记录v0-vi可达的距离,0 10 2 ,记录到达vi的路径,1 1 1 1 1 1 1,最小(Si=0),最小(Si=0),最小(Si=0),最小(Si=0),最小(Si=0),path=13467,V0V1 V0V1 10,V0V3 V0V3 30,V0V2 V0V3 V2 50,V0V4 V0V3 V2 V4 50,拓扑排序(Topological Sort) (AOV网),计划、施工过程、生产流程、程序流程等都是“工程”。除了很小的工程外,一般都把工程分为若干个叫做“活动”

26、的子工程。完成了这些活动,这个工程就可以完成了。 例如,计算机专业学生的学习就是一个工程,每一门课程的学习就是整个工程的一些活动。其中有些课程要求先修课程,有些则不要求。这样在有的课程之间有领先关系,有的课程可以并行地学习。,C1 高等数学C2 程序设计基础C3 离散数学 C1, C2 C4 数据结构 C3, C2C5 高级语言程序设计 C2C6 编译方法 C5, C4C7 操作系统 C4, C9C8 普通物理 C1C9 计算机原理 C8,课程代号,课程名称,先修课程,学生课程学习工程图,可以用有向图表示一个工程。在这种有向图中,用顶点表示活动,用有向边表示活动Vi 必须先于活动Vj 进行。这

27、种有向图叫做顶点表示活动的AOV网络 (Activity On Vertices)。 在AOV网络中不能出现有向回路, 即有向环。如果出现了有向环,则意味着某项活动应以自己作为先决条件。因此,对给定的AOV网络,必须先判断它是否存在有向环。 检测有向环的一种方法是对AOV网络构造它的拓扑有序序列。即将各个顶点 (代表各个活动)排列成一个线性有序的序列,使得AOV网络中所有应存在的前驱和后继关系都能得到满足。拓扑排序,拓扑排序- 在AOV网络中选一个没有直接前驱(度为0)的顶点, 输出; 从图中删去该顶点, 同时删去所有它发出的有向边; 重复以上 , 直到输出所有顶点或没有度为0的顶点。,C1

28、, C2 , C3 , C4 , C5 , C6 , C8 , C9 , C7 或 C1 , C8 , C9 , C2 , C5 , C3 , C4 , C7 , C6,拓扑排序的过程,(a) 有向无环图,V3,2 4 0 0 1 2,V1 V2 V3 V4 V5 V6,拓扑序列:,3,1,V4,1,0,V5,0,2,0,V1,1,V6,0,V2,V2,关键路径(Critical Path) (AOE网络),顶点Vi表示事件,弧ak表示活动,其权值为该活动持续的时间。每个事件发生时在它之前的活动已经完成,在它之后的活动可是开始。,问题: (1)工程至少需要多少时间?最短时间 (2)哪些活动是影

29、响工程进度的关键?关键路径,几个与计算关键活动有关的量:, 事件Vi 的最早可能开始时间Ve(i) 事件Vi 的最迟允许开始时间Vli 活动ak 的最早可能开始时间 ek 活动ak 的最迟允许开始时间 lk 时间余量 lk - ek,0, 事件Vi 的最早可能开始时间Ve(i),6,4,5,7,8,16,12,18,Ve1=0 Vej=MaxVei+dut(i,j),最短时间,18, 事件Vi 的最迟允许开始时间Vli,14,16,12,7,9,6,6,0,Vln= Vl n=18 Vlj=MinVli-dut(i,j), 活动ak 的最早可能开始时间 ek,0,0,0,6,4,5,7,7,8,16,12, 活动ak 的最迟允许开始时间 lk,0,2,4,6,6,9,7,9,12,16,14,0 2 4 0 2 4 0 2 4 0 2, 时间余量 lk - ek,关键路径:V1V2V5V7,小 结,一、图的定义:G=(V,E) 二、图的逻辑结构:非线性结构 多-多 三、图的概念及术语:有向图与无向图邻接点,顶点的度,子图,网络,路径及路径长度连通图与连通分量(无),强连通图与强连通分量 四、图的存储结构:邻接矩阵法、邻接表法、十字链表和多重邻接表 五、图的遍历:深度优先搜索遍历和广度优先搜索遍历 六、图的应用:最小生成树、最短路径拓扑排序、关键路径,

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

当前位置:首页 > 网络科技 > 数据结构与算法

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


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

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

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