数据结构(第七章图).ppt
《数据结构(第七章图).ppt》由会员分享,可在线阅读,更多相关《数据结构(第七章图).ppt(174页珍藏版)》请在课桌文档上搜索。
1、数 据 结 构,第 7 章 图,主要内容,7.1 图的定义和术语7.2 图的存储结构7.3 图的遍历7.4 图的连通性问题7.5 有向无环图及其应用7.6 最短路径,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为弧头无向图无向图G是由两个集合V(G)和E(G)组成的 其中:V(G)是顶
2、点的非空有限集 E(G)是边的有限集合,边是顶点的无序对,记为(v,w)或(w,v),并且(v,w)=(w,v),(u,v),V=Vertex E=Edge,7.1 图的定义和术语,有向图G1=(V,E)中:V(G1)=1,2,3,4,5,6E(G1)=,无向图G2=(V,E)中:V(G2)=1,2,3,4,5,6,7E(G2)=(1,2),(1,3),(2,3),(2,4),(2,5),(5,6),(5,7),图的示例,7.1 图的定义和术语,有向完全图有n(n-1)条弧的n个顶点的有向图无向完全图有n(n-1)/2条边的n个顶点的无向图稀疏图-若边或弧的个数 enlogn,则称作稀疏图,否
3、则成稠密图。权把图的边或弧赋予一个有意义的数,此数叫权带权图-网弧或边带权的图分别称作有向网或无向网。子图如果图G(V,E)和图G(V,E),满足:VV 且 EE,则称G为G的子图邻接点若无向图G中存在(V,W),则称V,W互为邻接点;边(V,W)和顶点V,W相关联。顶点的度无向图中,顶点的度为与该顶点相连的边数有向图中,顶点的度分成入度与出度入度:以该顶点为弧头的弧的数目出度:以该顶点为弧尾的弧的数目,7.1 图的定义和术语,证明:,完全有向图有n(n-1)条边。证明:若是完全有向图,则顶点1必与所有其他顶点各有2条连线,即有2(n-1)条边,顶点2有2(n-2)条边,顶点n-1有2条边,顶
4、点n有0条边.总边数2(n-1 n-210)=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-210=(n-1+0)n/2=n(n-1)/2,7.1 图的定义和术语,有向网(弧带权值),有向图顶点的度(TD)=出度(OD)+入度(ID),7.1 图的定义和术语,无向图,无向图(树),有向图,有向图,n(n-1)/2 条边,n(n-1)条边,G1的顶点集合为V(G1)=0,1,2,3边集合为E(G1)=(0,1),(0,
5、2),(0,3),(1,2),(1,3),(2,3),完全图,完全图,图的练习:判断下列4种图形各属什么类型?,7.1 图的定义和术语,简单路径:,路径上各顶点 v1,v2,.,vm 均不互相重复。,回路:,若路径上第一个顶点 v1 与最后一个顶点vm 重合,则称这样的路径为回路或环。,路径:,在图 G(V,E)中,若从顶点 vi 出发,沿一些边经过一些顶点 vp1,vp2,vpm,到达顶点vj。则称顶点序列(vi vp1 vp2.vpm vj)为从顶点vi 到顶点 vj 的路径。它经过的边(vi,vp1)、(vp1,vp2)、.、(vpm,vj)应当是属于E的边。,路径长度:,非带权图的路径
6、长度是指此路径上边的条数;带权图的路径长度是指路径上各边的权之和。,简单回路:图的顶点序列中,除了第一个顶点和最后一个顶点相同外,其余顶点不重复出现的回路叫简单回路。,7.1 图的定义和术语,路径13:1,2,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,7.1 图的定义和术语,连通图,强连通图,在无向图中,若从顶点vi到顶点vj有路径,则称顶点vi与vj是连通的。如果图中任
7、意一对顶点都是连通的,则称此图是连通图。非连通图的极大连通子图叫做连通分量。,在有向图中,若对于每一对顶点vi和vj,都存在一条从vi到vj和从vj到vi的路径,则称此图是强连通图。非强连通图的极大强连通子图叫做强连通分量。,7,7.1 图的定义和术语,假设一个(无向)连通图有 n 个顶点和 e 条边,其中 n-1 条边和 n 个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树。,对非连通图,则称由各个连通分量的生成树的集合为此非连通图的生成森林。,生成树,7.1 图的定义和术语,图的基本操作,结构的建立和销毁,插入或删除顶点,对邻接点的操作,对顶点的访问操作,遍历,插入和删除弧,
8、7.1 图的定义和术语,图的基本操作,CreatGraph(&G,V,VR):/按定义(V,VR)构造图,DestroyGraph(&G):/销毁图,结构的建立和销毁,7.1 图的定义和术语,图的基本操作,对顶点的访问操作,LocateVex(G,u);/若G中存在顶点u,则返回该顶点在/图中“位置”;否则返回其它信息。,GetVex(G,v);/返回 v 的值。,PutVex(/对 v 赋值value。,7.1 图的定义和术语,图的基本操作,对邻接点的操作,FirstAdjVex(G,v);/返回 v 的“第一个邻接点”。若该顶点/在 G 中没有邻接点,则返回“空”。,NextAdjVex(
9、G,v,w);/返回 v 的(相对于 w 的)“下一个邻接/点”。若 w 是 v 的最后一个邻接点,则/返回“空”。,7.1 图的定义和术语,图的基本操作,插入或删除顶点,InsertVex(/在图G中增添新顶点v。,DeleteVex(/删除G中顶点v及其相关的弧。,7.1 图的定义和术语,图的基本操作,插入和删除弧,InsertArc(/在G中增添弧,若G是无向的,/则还增添对称弧(w,v)。,DeleteArc(/在G中删除弧,若G是无向的,/则还删除对称弧(w,v)。,7.1 图的定义和术语,图的基本操作,遍 历,DFSTraverse(G,v,Visit();/从顶点v起深度优先遍历
10、图G,并对每/个顶点调用函数Visit一次且仅一次。,BFSTraverse(G,v,Visit();/从顶点v起广度优先遍历图G,并对每/个顶点调用函数Visit一次且仅一次。,7.2 图的存储结构,一、图的数组(邻接矩阵)存储表示,二、图的邻接表存储表示,三、有向图的十字链表存储表示,四、无向图的邻接多重表存储表示,7.2 图的存储结构,图的数组存储表示,用两个数组分别存储顶点信息和顶点之间的关系信息(邻接矩阵表示顶点间相邻关系的矩阵)定义:设G=(V,E)是有n1个顶点的图,G的邻接矩阵A(二维数组)是具有以下性质的n阶方阵:,7.2 图的存储结构,图的数组存储表示,邻接矩阵特点:无向图
11、的邻接矩阵对称,可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2有向图邻接矩阵不一定对称;有n个顶点的有向图需存储空间为n无向图中顶点Vi的度TD(Vi)是邻接矩阵A中第i行元素之和(第i行非0元素1的个数)有向图中,顶点Vi的出度是A中第i行元素之和顶点Vi的入度是A中第i列元素之和,7.2 图的存储结构,图的数组存储表示,网的邻接矩阵示意图,网的邻接矩阵可定义为:,反之,容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。n个顶点需要n*n个单元存储边(弧);空间效率为O(n2)。对稀疏图而言尤其浪费空间。,邻接矩阵法优点:,邻接矩阵法缺点:,ty
12、pedef struct ArcCell/弧的定义 VRType adj;/VRType是顶点关系类型,/对无权图,用1或0表示相邻否;对带权图,则为权值类型。InfoType*info;/该弧相关信息的指针 ArcCell,AdjMatrix MAX_VERTEX_NUMMAX_VERTEX_NUM;,#define INFINITY INT_MAX/定义无穷大#define MAX_VERTEX_NUM 20/定义图的类型 有向图,有向网,无向图,无向网typedef enum DG,DN,UDG,UDN GraphKind;,typedef struct/图的定义 VertexType
13、vexsMAX_VERTEX_NUM;/顶点数组 AdjMatrix arcs;/邻接矩阵,可设二维 int vexnum,arcnum;/顶点数,弧数 GraphKind kind;/图的种类标志 MGraph;,7.2 图的存储结构,图的数组(邻接矩阵)存储表示实现,7.2 图的存储结构,图的数组(邻接矩阵)存储表示实现,G1.vexs=1,2,3,4;,G1.arcs=,G2.vexs=1,2,3,4,5;,G2.arcs=,7.2 图的存储结构,图的邻接表存储表示,表头结点结构:数据域(data)用于存储顶点的名或其它有关信息;链域(firstarc)用于指向链表中第一个顶点(即与顶点
14、 vi邻接的第一个邻接点)边表结点结构:adjvex 与顶点vi邻接的点在图中的位置 info 存储和边相关的信息(若无,则置空NULL)nextarc 指向下一条边的结点的指针,表头结点 弧结点,实现:为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(有向图中指以Vi为尾的弧);同时为每一个单链表附设一个表头结点,并将所有的表头结点顺序存储(数组),以便随机访问任一顶点的链表。,typedef struct ArcNode/弧结点 int adjvex;/邻接点域,存放与Vi邻接的点在表头数组中的位置 struct node*nextarc;/链域,指示依附于vi的下
15、一条边或弧的结点,/VRType weight;InfoType*info;/定义与弧相关的权值,无权则为0ArcNode;/定义 指向该弧相关信息的指针,typedef struct/图的结构定义 AdjList vertices;/顶点向量 int vexnum,arcnum;GraphKind kind;/图的种类标志 MGraph;,7.2 图的存储结构,图的邻接表存储表示,7.2 图的存储结构,图的邻接表存储表示,提示:在无向图,每一个边结点在图的单链表中出现两次,故无向图中若有n个顶点和e条边,则需要存储空间为:n+2e,7.2 图的存储结构,图的邻接表存储表示,邻接表特点无向图中
16、顶点Vi的度为第i个单链表中的结点数有向图中顶点Vi的出度为第i个单链表中的结点个数顶点Vi的入度为整个单链表中邻接点域值是i的结点个数(以vi为弧头)。,为此需遍历整个邻接表。,一种解决的方法是逆邻接表法,一种解决的方法是逆邻接表法,我们可以对每一顶点vi再建立一个逆邻接表,即对每个顶点vi建立一个所有以顶点vi为弧头的弧的表,如图所示。,图G1的邻接表 和 逆邻接表表示法,7.2 图的存储结构,图的邻接表存储表示,7.2 图的存储结构,图的邻接表存储表示,讨论:邻接表与邻接矩阵有什么异同之处?,联系:邻接表中每个链表对应于邻接矩阵中的一行,链表中结点个数等于该行中非零元素的个数。2.区别:
17、对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),但邻接表不唯一(链接次序与顶点编号无关)。邻接矩阵的空间复杂度为O(n2),而邻接表的空间复杂度为O(n+e)。e随n的改变而变化-函数关系3.用途:邻接矩阵多用于稠密图的存储(e接近n(n-1)/2);而邻接表多用于稀疏图的存储(en2),7.2 图的存储结构,图的邻接表存储表示,图的邻接表是应用较多的一种存储结构。从邻接表的结构定义可见,建立邻接表的主要操作是在链表中插入一个结点,以下是输入无向图的顶点和边建立邻接表的算法步骤。,头插法,建立有(无)向图的邻接表,7.2 图的存储结构,图的邻接表存储表示,建立有(无)向图的邻接
18、表,建立邻接表的主要操作是在链表中插入一个结点,以下是输入有向图的顶点和弧建立邻接表的算法。,依次输入的数据为:1.5 7 DG 2.A B C D E 3.AB AE BC CD DA DB EC,尾插法,7.2 图的存储结构,图的邻接表存储表示,void CreateGraph(MGraph/确定sv和tv/在G中位置,即顶点在G.vertices中的序号,pi=new ArcNode;if(!pi)exit(-1);/存储分配失败pi-adjvex=j;/对弧结点赋邻接点位置“if(G.kind=DN|G.kind=DG)cin w p;/有向图输入权值和其它信息存储地址 else w=
19、0;p=NULL;pi-weight=w;pi-info=p;pi-nextarc=G.verticesi.firstarc;/头插法,将tv结点插入到第i个单链表中G.verticesi.firstarc=pi;/插入链表G.verticesi,7.2 图的存储结构,图的邻接表存储表示,if(G.kind=UDG|G.kind=UDN)/对无向图或无向网尚需建立tv的邻接点:4 pj=new ArcNode;if(!pi)exit(-1);/存储分配失败pj-adjvex=i;/对边结点赋邻接点“位置”pj-weight=w;pj-info=p;/头插法,将sv结点插入到第j个单链表中,插入
20、链表G.verticesj pj-nextarc=G.verticesj.firstarc;G.verticesj.firstarc=pj;/if/for/CreateGraph,虽然在有向图的邻接表和逆邻接表中分别可以找到从顶点出发的弧和指向顶点的弧,但对于同一个有向图需要用两个结构来表示它毕竟不方便,因此当应用问题中同时需要对这两种弧进行处理时就需要采用十字链表来表示有向图。十字链表是有向图的另一种链式存储结构,目的是将在有向图的邻接表和逆邻接表中两次出现的同一条弧用一个结点表示,由于在邻接表和逆邻接表中的顶点数据是相同的,则在十字链表中只需要出现一次,但需保留分别指向第一条出弧和第一条入
21、弧的指针。是邻接表和逆邻接表两者的结合:对于有向图中的每一条弧有一个弧结点,每一个顶点有一个顶点结点。,7.2 图的存储结构,有向图的十字链表存储表示,7.2 图的存储结构,有向图的十字链表存储表示,是 有向图的邻接表和逆邻接表组合,7.2 图的存储结构,有向图的十字链表存储表示,typedef struct ArcNode int tailvex,headvex;/弧尾、弧头在表头数组中位置 struct ArcNode*hlink;/指向弧头相同的下一条弧 struct ArcNode*tlink;/指向弧尾相同的下一条弧 InfoType*info;/定义弧的相关信息,如权值 ArcNo
22、de;,typedef struct VexNode int data;/存与顶点有关信息 ArcNode*firstin;/指向以该顶点为弧头的第一个弧结点 ArcNode*firstout;/指向以该顶点为弧尾的第一个弧结点VexNode;,弧结点:,顶点结点:,typedef struct/图的定义 VexNode xlistMAX_VERTEX_NUM;/顶点结点(表头向量)int vexnum,arcnum;/有向图的当前顶点数和弧数 OLGraph;,7.2 图的存储结构,0 1 2,有向图的十字链表存储表示,7.2 图的存储结构,无向图的邻接多重表存储表示,类似于有向图的十字链表
23、,若将无向图中表示同一条边的两个结点合在一起,将得到无向图的另一种表示方法-邻接多重表。,7.2 图的存储结构,无向图的邻接多重表存储表示,在邻接多重表中,每一条边用一个结点表示,边结点结构如下:,const MAX_VERTEX_NUM=20;typedef emnu unvisited,visited VisitIf;typedef struct EdgeNode/边结点结构定义VisitIf mark;/访问标记int ivex,jvex;/该边依附的两个顶点(vi,vj)在图中的位置struct EdgeNode*ilink,*jlink;/分别指向依附这两个顶点的下一条边VRType
24、 weight;/与弧相关的权值,无权则为0InfoType*info;/与该边相关信息的指针;,顶点结点:,typedef struct/顶点结点结构定义 VertexType data;EdgeNode*firstedge;/指向第一条依附该顶点的边 VexNode;typedef struct/多重链表结构定义VexNode adjmulistMAX_VERTEX_NUM;int vexnum,edgenum;/无向图的当前顶点数和边数GraphKind kind;/图的种类标志 AMLGraph;,7.2 图的存储结构,无向图的邻接多重表存储表示,例如,无向图的邻接多重表如下所示(忽略
25、相关信息指针),7.2 图的存储结构,各种存储结构的适用类型,数组(邻接矩阵):有向图和无向图邻接表(逆邻接表):有向图和无向图十字链表:有向图邻接多重表:无向图,7.3 图的遍历,从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程。,图的遍历(Traversing Graph):,提示:前面学习过树的遍历有递归遍历(前序、中序和后序)和非递归算法 演示,提问:树的遍历能否用于图的遍历?能或不能为什么?不能!因为图有回路,若用树的遍历算法可能导致无限循环。为防止循环,可设置已访问标志。然而,图中可能有孤立点,若不加修改地使用树的遍历,就可能会遗漏图中的一部分顶点
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第七
链接地址:https://www.desk33.com/p-229771.html