1、数据结构,7.1 图的定义和术语,第七章 图,7.2 图的存储结构,7.3 图的遍历,7.4 图的连通性问题,7.5 有向无环图的应用,数学家欧拉曾经解决过著名的七桥问题:城市中有一条河,河中有A、D两个岛,河上有七座桥来连接两个岛及河的B、C两岸,问:能否刚好经过每座桥一次,既无重复也无遗漏?,在线性结构中,数据元素之间仅具有线性关系; 在树结构中,结点之间具有层次关系; 在图结构中,任意两个顶点之间都可能有关系。,不同结构中逻辑关系的对比,在线性结构中,元素之间的关系为前驱和后继; 在树结构中,结点之间的关系为双亲和孩子; 在图结构中,顶点之间的关系为邻接。,不同结构中逻辑关系的对比,7.
2、1 图的定义和术语,一.图的定义,例1 G1= V1=v1,v2,v3,v4 ,v5 E1=(v1,v2),(v1,v4),(v2,v3),(v2,v5),(v3,v4),(v3,v5),G1图示,无序对(vi,vj): 用连接顶点vi、vj的线段 表示,称为无向边;,无向图:在图G中,若所有边是无向边,则称G为无向图;,例2 G2= V2=v1,v2,v3,v4 E2=(v1,v2),(v1,v3),(v1,v4),(v2,v3),(v2,v4),(v3,v4),G2图示,完全图:若具有n个结点的无向图,其边数达到最大值 n(n-1)/2,则称图为完全图;,例3 G3= V3=v1,v2,v
3、3,v4 E3=, , , ,G3图示,有序对 : 用以为vi起点、以vj为终点 的有向线段表示,称为有向 边或弧;,有向图:在图G中,若所有边是有向边,则称G为有向图; 有向完全图:具有n(n-1)条弧的有向图。,例1 交通图(公路、铁路)顶点:地点边:连接地点的公路交通图中的有单行道双行道,分别用有向边、无向边表示; 例2 电路图顶点:元件边:连接元件之间的线路 例3 通讯线路图顶点:地点边:地点间的连线 例4 各种流程图如产品的生产流程图顶点:工序边:各道工序之间的顺序关系,1.顶点的度,对于有向图而言, 有:顶点的出度:以顶点v为出发点的边的数目,记为OD(v)。顶点的入度:以顶点v
4、为终止点的边的数目,记为ID(v)。顶点的度: TD(v) = OD(v) + ID(v) 对于无向图而言,有:顶点的入度=顶点的出度 图的度为图中结点度的最大值。,2. 路径和回路,无向图D=(V,E)中的顶点序列v1,v2, ,vk,若(vi,vi+1)E(i=1,2,k-1), v =v1, u =vk, 则称该序列是从顶点v到顶点u的路径;若v=u,则称该序列为回路;有向图D=(V,E)中的顶点序列v1,v2, ,vk, 若E ( i=1,2,k-1), v =v1, u =vk, 则称该序列是从顶点v到顶点u的路径;若v=u,则称该序列为回路;,3.子图,图1,图2,图3,4. 连通
5、图和连通分量,在无向图G=(V, E)中,若对任何两个顶点v、u都存在从v到u的路径,则称G是连通图。,非连通图的极大连通子图称为连通分量。,连通图,非连通图,是子图; 子图是连通的; 连通子图含有极大顶点数; 具有极大顶点数的连通子图包含依附于这些顶点的所有边。,5. 强连通图和强连通分量,在有向图G=( V, E )中,若对任何两个顶点v、u都存在从v到u的路径,则称G是强连通图。,强连通图,非强连通图的极大强连通子图称为强连通分量。,非强连通图,观察:强连通分量中一般存在回路;划分后可能会丢掉一些弧,但顶点不能丢。,6.生成树,极小连通子图:该子图是G的连通子图,在该子图 中删除任何一条
6、边,子图不再连通。,若T是G的生成树当且仅当T满足如下条件:T是G的连通子图T包含G的所有顶点T中无回路,说明,6.生成树,一棵有n个顶点的生成树有且仅有n-1条边,但有n-1条边和n个顶点的图不一定是生成树。,如果一个图有n个顶点和少于n-1条边,则该图一定不是连通图。,说明,如果一个图有n个顶点和多于n-1条边,则该图一定有环。,6.生成树,画出下图的生成树:,规律:一棵有n个顶点的生成树有且仅有n-1条边。,7.2 图的存储结构,一.数组表示法(邻接矩阵),7.2 图的存储结构,一.数组表示法(邻接矩阵),7.2 图的存储结构,无向图数组表示法特点,无向图邻接矩阵是对称矩阵,同一条边表示
7、了两次;,顶点v的度:等于二维数组对应行(或列)中1的个数;,一.数组表示法(邻接矩阵),7.2 图的存储结构,无向图数组表示法特点,判断两顶点v、u是否为邻接点:只需判断二维数组对应分量是否为1;,顶点不变,在图中增加、删除边:只需对二维数组对应分量赋值1或清0;,一.数组表示法(邻接矩阵),7.2 图的存储结构,无向图数组表示法特点,设存储顶点的一维 数组大小为m, G占用存储空间:m+m2,G占用存储空间只与它的顶点数有关,与边数无关,适用于边稠密图。,一.数组表示法(邻接矩阵),7.2 图的存储结构,有向图数组表示法特点,有向图的邻接矩阵的第i行元素1的个数为第i个顶点的出度;第i列元
8、素1的个数为第i个顶点的入度。,一.数组表示法(邻接矩阵),7.2 图的存储结构,网的邻接矩阵是满足如下条件的n阶矩阵:,#define INFINITY INT_MAX /最大值 #define MAX_VERTEX_NUM 20 /最大顶点个数 typedef enum DG,DN,UDG,UDN GraphKind; /图种类有向图,有向网,无向图,无向网 typedef struct ArcCell /边(弧)信息 VRType adj; /图取值0或1,网取值InfoType *info; /弧相关信息指针ArcCell, AdjMatrixMAX_VERTEX_NUMMAX_VER
9、TEX_NUM; typedef struct VertexType vexsMAX_VERTEX_NUM; /存储顶点的一维数组AdjMatrix arcs; /存储邻接矩阵的二维数组int vexnum, arcnum; /图的当前顶点数和弧数GraphKind kind; /图的种类标志 Mgraph;,一.数组表示法(邻接矩阵),161页,设G是Mgraph 类型的变量,用于存储无向图,该图有n个顶点,e条边G的图示如下:,一.数组表示法(邻接矩阵),status CreateUDN(MGraph ,162页,优点:容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点
10、的邻接点等等。缺点:n个顶点需要n*n个单元存储边(弧);空间效率为O(n2)。对稀疏图而言尤其浪费空间。,一.数组表示法(邻接矩阵),二.邻接表,1 . 无向图的邻接表,顶点:通常按编号顺序将顶点数据存储在一维数组中; 关联同一顶点的边:用线性链表存储,例,二.邻接表,1 . 无向图的邻接表,表头结点,边(弧)结点,data:顶点信息,firstarc:指向关联该顶点的第一条边(弧)链表,adjvex:边(弧)的另一顶点的在数组中的位置,nextarc:指向下一条边(弧)结点的指针,Info,Info:该弧的相关信息的指针,二.邻接表,#define MAX_VERTEX_NUM 20 ty
11、pedef struct ArcNode /边(弧)结点的类型定义int adjvex; /该弧所指向顶点的位置 struct ArcNode *nextarc;InfoType *info; /该弧相关信息的指针 ArcNode; typedef struct VNode /表头结点的类型定义VertexType data; /顶点信息ArcNode * firstarc; VNode, AdjListMAX_VERTEX_NUM; typedef struct AdjList vertices; /顶点数组int vexnum, arcnum; /图的当前顶点数和弧数int kind; /
12、图的种类标志 ALGraph;,设G是ALGraph 类型的变量,用于存储无向图G,该图有n个顶点,e条边。G的图示如下:,无向图G,G.vertices G.vexnumG.arcnumG.kind,V1 V2 V3 V4 V5,5 6 UDG,2,data firstarc,adjvex nextarc,1)在G邻接表中,同一条边对应两个结点; 2)顶点v的度:等于v对应线性链表的长度; 3)判定两顶点v ,u是否邻接:要看v对应线性链表中有无对应的结点; 4)在G中增减边:要在两个单链表插入、删除结点; 5)设存储顶点的一维数组大小为m, 图的边数为e,G占用存储空间为:m+2*e。G占
13、用存储空间与G的顶点数、边数均有关;适用于边稀疏的图;,说明,二.邻接表,2 . 有向图的邻接表,顶点:用一维数组存储(按编号顺序) 以同一顶点为起点的弧:用线性链表存储,D.verticesD.vexnumD.arcnuD.kind,V1 V2 V3 V4,4 4 DG,0,1,2,3,二.邻接表,3 . 有向图的逆邻接表,顶点:用一维数组存储(按编号顺序) 以同一顶点为终点的弧: 用线性链表存储表,D.vertices D.vexnumD.arcnuD.kind,V1 V2 V3 V4,4 4 DG,0,1,2,3,优点:空间效率高;容易寻找顶点的邻接点。缺点:判断两顶点间是否有边或弧,需
14、搜索两结点对应的单链表,没有邻接矩阵方便。,二.邻接表,自学:十字链表表示法,164页,三.有向图邻接表的构造,A,B,L,M,C,F,D,E,G,H,J,K,I,13,13 ABCDEFGHIGKLM AB AC AF AL BM DE GH GI GK HK JL JM LM,例,.txt 文件,data firstarc,data firstarc,G.verG.vexnumG.arcnum,1234513,A B C D E,13 13,M,12,adjvex nextarc,6,3,12,13,12,5,在一个无向图中,所有顶点的度数之和等于所有边数的 倍。,A. 1/2 B. 1 C. 2 D. 4,练习,3. 一个n个顶点的无向图最多有 边。,A. n B. n(n-1) C. n(n-1)/2 D. 2n,练习,