1、图和图的存储结构,图的定义和术语,图的存储表示,小结和作业,创建图,课堂练习,图和图的存储结构,1. 图的结构定义,2. 图的名词和术语,3. 图的基本操作,图的结构定义,谓词 P(v,w) 定义了弧 的意义或信息。,图是由一个顶点集 V 和一个弧集 R构成的数据结构。,Graph = (V, R )R| v,wV 且 P(v,w),表示从 v 到 w 的一条弧(Arc), 称 v 为弧尾(tail),w 为弧头(head)。,图的结构定义有向图,如果“弧”是有方向的,则称由顶点集和弧集构成的图为有向图。,例如:,G1 = (V1, R1),V1=A, B, C, D, E,R1=, , ,
2、, , ,图的结构定义无向图,若R 必有R,则以无序对(v,w) 代替这两个有序对,称 (v,w) 为顶点 v 和顶点 w 之间存在一条边。,上述这种由顶点集和边集构成的图称作无向图。,图的结构定义无向图,例如: G2=(V2,R2),V2=A, B, C, D, E, F,R2=(A, B), (A, E),(B, E), (B, F), (C, D), (C, F) (D, F,名词和术语,1)网、子图,2)完全图、稀疏图、稠密图,3)邻接点、度、入度、出度,4)路径、路径长度、简单路径、简单回路,5)连通图、连通分量、强连通图、强连通分量,6)生成树、生成森林,名词和术语,1)子图,设图
3、G=(V,R) 和图 G=(V,R), 且 VV, RR, 则称 G 为 G 的子图。,B,名词和术语,1)网,弧或边带权的图分别称作有向网或无向网。,15,9,7,21,11,3,2,名词和术语,2)完全图、稀疏图、稠密图,假设图中有 n 个顶点,e 条边,则,含有 e=n(n-1)/2 条边的无向图称作完全图;,含有 e=n(n-1) 条弧的有向图称作有向完全图;,若边或弧的个数 enlogn,则称作稀疏图,否则称作稠密图。,名词和术语,3)邻接点、度、入度、出度,邻接点:假若顶点v和顶点w之间存在一条边,则称顶点v和w互为邻接点,,度:和顶点v关联的边的数目,记为TD(V)。,边(v,w
4、) 和顶点v和w相关联。,名词和术语,3)邻接点、度、入度、出度,例如:,TD(B) = 3,TD(A) = 2,右侧图中的无向图,名词和术语,3)邻接点、度、入度、出度,顶点的出度: 以顶点v 为弧尾的弧的数目;记为OD(v),对于右图所示的有向图来说,由于弧有方向性,则有入度和出度之分,名词和术语,3)邻接点、度、入度、出度,顶点的入度: 以顶点v为弧头的弧的数目,记为ID(v),顶点的度(TD)= 出度(OD)+入度(ID),ID(B) = 2,OD(B) = 1,TD(B) = 3,名词和术语,4)路径、路径长度、简单路径、简单回路,路径:设图G=(V,R)中的一个顶点序列u=vi,0
5、,vi,1, , vi,m=w中,(vi,j-1,vi,j)R, 1jm,则称从顶点u 到顶点w 之间存在一条路径。 路径长度:路径上边的数目。,如:从A到D长度为 3 的路径A,B,C,D,名词和术语,4)路径、路径长度、简单路径、简单回路,简单路径:指序列中顶点不重复出现的路径。,简单回路:指序列中第一个顶点和最后一个顶点相同的路径。,名词和术语,5)连通图、连通分量、强连通图、强连通分量,连通图:若无向图G中任意两个顶点之间都有路径相通,则称此图为连通图;,名词和术语,5)连通图、连通分量、强连通图、强连通分量,连通分量:若无向图为非连通图,则图中各个极大连通子图称作此图的连通分量。,名
6、词和术语,5)连通图、连通分量、强连通图、强连通分量,强连通图:若有向图任意两个顶点之间都存在一条有向路径,则称为强连通图。,否则,其各个强连通子图称作它的强连通分量。,名词和术语,6)生成树、生成森林,连通图的生成树:是一个极小连通子图,它含有图中的全部顶点,但只有足以构成一棵树的n-1条边。,名词和术语,6)生成树、生成森林,生成森林:对非连通图,则称由各个连通分量的生成树的集合为此非连通图的生成森林。,基本操作,1.结构的建立和销毁,3.插入或删除顶点,5.对邻接点的操作,2.对顶点的访问操作,6.遍历,4.插入和删除弧,基本操作,CreatGraph(&G, V, R):/ 按定义(V
7、, R) 构造图,DestroyGraph(&G):/ 销毁图,1.结构的建立和销毁,基本操作,2.对顶点的访问操作,LocateVex(G, u); / 若G中存在顶点u,则返回该顶点在/ 图中“位置” ;否则返回其它信息。,GetVex(G, v); / 返回 v 的值。,PutVex(/ 对 v 赋值value。,基本操作,3.插入或删除顶点,InsertVex( /在图G中增添新顶点v。,DeleteVex(/ 删除G中顶点v及其相关的弧。,基本操作,4.插入和删除弧,InsertArc( / 在G中增添弧,若G是无向的,/则还增添对称弧。,DeleteArc( /在G中删除弧,若G是
8、无向的,/则还删除对称弧。,基本操作,5.对邻接点的操作,FirstAdjVex(G, v); / 返回 v 的“第一个邻接点” 。若该顶点 /在 G 中没有邻接点,则返回“空”。,NextAdjVex(G, v, w); / 返回 v 的(相对于 w 的) “下一个邻接 / 点”。若 w 是 v 的最后一个邻接点,则 / 返回“空”。,基本操作,6.遍历,DFSTraverse(G, v, Visit(); /从顶点v起深度优先遍历图G,并对每 /个顶点调用函数Visit一次且仅一次。,BFSTraverse(G, v, Visit(); /从顶点v起广度优先遍历图G,并对每 /个顶点调用函
9、数Visit一次且仅一次。,一、图的数组(邻接矩阵)存储表示,二、图的邻接表存储表示,三、有向图的十字链表存储表示,四、无向图的邻接多重表存储表示,图的存储表示,图的存储表示-邻接矩阵,定义:矩阵的元素为,无向图:对称矩阵,图的存储表示-邻接矩阵,有向图的邻接矩阵为非对称矩阵,图的存储表示-邻接矩阵,#define INFINITY INT_MAX /最大值,#define MAX_VERTEX_NUM 20 /最大顶点个数,Typedef enumDG,DN,UDG,UDN GraphKind /有向图,有向网,无向图,无向网,图的存储表示-邻接矩阵,typedef struct ArcCe
10、ll / 弧的定义VRType adj; / VRType是顶点关系类型。/ 对无权图,用1或0表示相邻否;/ 对带权图,则为权值类型。InfoType *info; / 该弧相关信息的指针 ArcCell,图的存储表示-邻接矩阵,typedef struct / 图的定义VertexType vexsMAX_VERTEX_NUM; / 顶点信息ArcCell arcsMAX_VERTEX_NUMMAX_VERTEX_NUM;/ 弧的信息 int vexnum, arcnum; / 顶点数,弧数 GraphKind kind; / 图的种类标志 MGraph;,图的存储表示-邻接表,1)无向图
11、的邻接表,图的存储表示-邻接表,2)有向图的邻接表-每个顶点链接的是以该顶点为弧尾的弧,但是,在有向图的邻接表中不易找到指向该顶点的弧,图的存储表示-邻接表,3)有向图的逆邻接表-每个顶点链接的是指向该顶点的弧,图的存储表示-邻接表,邻接表:图的链式存储结构,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附顶点Vi的边。,对有向图来说,是指以顶点Vi的为弧尾的弧。,图的存储表示-邻接表,邻接表:图的链式存储结构,adjvex,nextarc,info,邻接点域,链域,数据域(存放权值等),表结点:,头结点:,data,firstarc,数据域,链域,指向链表中第一个结点,弧结点,顶点
12、结点,图的存储表示-邻接表,图的邻接表: 1、容易找到任意顶点的一个邻接点 2、但是要判定任意两个顶点(vi,vj)之间是否有边或者弧相连,需要搜索第i个或者第j个链表,不如邻接矩阵方便。,图的存储表示-有向图的十字链表,0 1 2,图的存储表示-有向图的十字链表,指向下一个有相同弧尾的结点,指向下一个有相同弧头的结点,tailvex,headvex,hlink,tlink,info,弧的结点结构,弧的结点结构表示,typedef struct ArcBox / 弧的结构表示int tailvex, headvex; InfoType *info;struct ArcBox *hlink, *
13、tlink; ArcBox;,图的存储表示-有向图的十字链表,顶点的结点结构表示,typedef struct VexNode / 顶点的结构表示VertexType data; ArcBox *firstin, *firstout; VexNode;,图的存储表示-有向图的十字链表,十字链表,图的存储表示-有向图的十字链表,typedef struct VexNode xlistMAX_VERTEX_NUM; / 顶点结点(表头向量) int vexnum, arcnum;/有向图的当前顶点数和弧数 OLGraph;,无向图的邻接多重表存储表示,mark ivex ilink jvex jl
14、ink,无向图的邻接多重表存储表示,typedef struct Ebox VisitIf mark; / 访问标记int ivex, jvex;/该边依附的两个顶点的位置struct EBox *ilink, *jlink; InfoType *info; / 该边信息指针 EBox;,边的结构表示,无向图的邻接多重表存储表示,顶点的结构表示,typedef struct VexBox VertexType data;EBox *firstedge; / 指向第一条依附该顶点的边 VexBox;,无向图的邻接多重表存储表示,typedef struct / 邻接多重表VexBox adjmu
15、listMAX_VERTEX_NUM;int vexnum, edgenum; AMLGraph;,无向图的结构表示,创建图,输入边形式1: .,输入边形式2: .,输入顶点: A B C.,1、输入参数:vexnum, arcnum, GraghKind,2、输入顶点信息,3、根据GraghKind,决定边是否要带权重,4、采用某种形式逐条输入边,将它插入到存储结构中,建立存储结构的一般步骤:,创建图,Status CreateGragh(ALGraph ,创建图,Status CreateDG(ALGraph G.verticesi.data = data/输入顶点信息 ,创建图,Stat
16、us CreateDG(ALGraph /添加到最左边 ,创建图,时间复杂度分析(第2种输入形式)第1个for: n第2个for: e所以O(n + e),时间复杂度分析(第1种输入形式)第1个for: n第2个for: n.e所以O(n.e),创建图,存储结构的转换,Status TranslateDG(ALGraph G1, MGraph ,Status TranlateDG(ALGraph G1, MGraph ,存储结构的转换,Status TranlateDG(ALGraph G1, MGraph ,存储结构的转换,课堂练习,V1,V2,V3,V4,V5,1、邻接矩阵,2、邻接表,3
17、、邻接多重表,V2,V1,V4,V3,1、邻接矩阵,2、邻接表,3、十字链表,课堂练习,下面关于图的存储的叙述中正确的是() A)用相邻矩阵法存储图,占用的存储空间大小只与图中结点个数有关,而与边数无关 B)用相邻矩阵法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关 C)用邻接表法存储图,占用的存储空间大小只与图中结点个数有关,而与边数无关 D)用邻接表法存储图,占用的存储空间大小只与图中边数有关,而与结点个数无关,课堂练习,小结和作业,1.图的基本概念以及图的特点,2.图的存储表示:,1.图的数组(邻接矩阵)存储表示,2.图的邻接表存储表示,3.有向图的十字链表存储表示,4.无向图的邻接多重表存储表示,3.创建图,小结和作业,作业:7.1(2,3,4)、7.3 注意: 书上答案有问题将节点中的1,2,3,4,5,6改成V1, V2,V3V4, V5, V6,