1、第 七 章 图71基本概念和术语 一、图的定义图是一种数据元素间为多对多关系的数据结构,加上一组基本操作构成的抽象数据类型。 ADT Graph数据对象V :V是具有相同特性的数据元素的集合,称为顶点集。数据关系R:R=VRVR=|v,w(-V且P(v,w),表示从v到w的弧,谓词 P(v,w)定义了弧的意义或信息基本操作P:CreateGraph(初始条件:V是图的顶点集,VR是图中弧的集合。操作结果:按V和VR的定义构造图G,退出,DestroyGraph( 初始条件:图G存在,v是G中某个顶点 操作结果:返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回“空”,NextAdjVex
2、(G,v,w); 初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点。 操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接点,则返回“空” InsertVex( 初始条件:图G存在,v和w是G中两个顶点 操作结果:在G中删除弧,若G是无向的,则还删除对称弧,DFSTraverser(G,v,Visit(); 初始条件:图G存在,v是G中某个顶点,Visit是顶点的应用函数 操作结果:从顶点v起深度优先遍历图G,并对每个顶点调用函数Visit一次。一旦Visit()失败,则操作失败。 BFSTRaverse(G,v,Visit(); 初始条件:图G存在,v是G中某个顶点,
3、Visit是顶点的应用函数 操作结果:从顶点v起广度优先遍历图G,并对每个顶点调用函数Visit一次。一旦Visit()失败,则操作失败。 ADT Graph 二、图的常用术语 图中的数据元素称为顶点;V是顶点的有穷非空集合;VR是两个顶点之间的关系的集合.若VR,则表示从v到w的一条弧,称v为弧尾或初始点,称w为弧头或终端点,此时图称为有向图.若VR,必有VR,则以无序对(v,w)表示,表示v和w的一条边,此时的图称为无向图.,对上图有:G1=(V1,A1) 其中:V1=v1,v2,v3,v4 A1=, 如果用n表示图中顶点数目,用e表示边或弧的数目,则有: 对于无向图,e的取值范围是0到n
4、(n-1)/2,有n(n-1)/2条边的无向图称为完全图。,对于有向图,e有取值范围是0到n(n-1)。 具有n(n-1)条弧的有向图称为有向完全图。 有很少条边或弧的图称为稀疏图,反之称为稠密图。,对于无向图G=(V,E),如果边(v,v) E,则称顶点v和v互为邻接点,既v和v相邻接.边(v,v)依附于顶点v和v,或者说(v,v)和顶点v和v相关联.顶点v的度是和v相关联的边的数目,记为TD(V).对于有向图G=(V,A)如果弧 A,称顶点v邻接到顶点v,顶点v邻接自顶点v,.弧 和顶点v,v相关联.以顶点v为头的弧的数目称为v的入度,记为ID(v);以v为尾的弧的数目称为v的出度,记为O
5、D(v),顶点v的度为TD(v)= ID(v)+ OD(v).路径是一个顶点序列.如果G是有向图,则路径也是有向的.路径长度是路径上的边或弧的数目.第一个顶点和最后一个顶点相同的路径称为回路或环.序列中顶点不重复出现的路径称为简单路径.除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环.在无向图中,如果从顶点v到顶点v 有路径,则称v和v是连通的.如果对于图中任意两个顶点都是连同的,称G是连通图.无向图的极大连通子图称为连通分量.,对有向图,如果每一对顶点之间都有通路,则称该图为强连通图。 有向图中的极大强连通子图称为有向图的强连通分量.,图6-1,图6-2,一个
6、连通图的生成树是一个极小连通子图,它含有图中全部顶点,但只有足以构成一棵树的n-1条边.如果一个有向图恰有一个顶点的入度为0,其余顶点的入度均为1,则是一棵有向树,一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧.,72图的存储结构 一、数组表示法用两个数组分别存储数据元素(顶点)的信息和数据元素 之间的关系(边或弧)的信息。/ 图的数组(邻接矩阵)存储表示 #define INFINITY INT_MAX /最大值无穷大 #define MAX_VERTEX_NUM 20 /最大顶点个数 typedef enumDG,DN,AG,AN Grap
7、hKind;/有向图,有向网,无向图,无向网 typedef struct ArcCell VRType adj; /VRType是顶点关系类型。对无权图,用1或0表示相邻否,对带权图,则为权值类型 InfoType *info; /该弧相关停息的指针 ArcCell,AdjMatrixmax_vertex_nummax_vertex_num;,tpyedef struct VertexType vexsMAX_VERTEX_NUM; /顶点向量 AdjMatrix arcs; /邻接矩阵 int vexnum,arcnum; /图的当前顶点数和弧数 GraphKind kind; /图的种类
8、标志 MGraph;图邻接矩阵表示如下:,二、邻接表 邻接表是图的一种链式存储结构。 在邻接表中,对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边(对有向图是以顶点vi为尾的弧)。每个结点由三个域组成,其中邻接点域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextarc)指示下一条边或弧的结点;数据域(info)存储和边或弧相关的信息,如权值等。每个链表上附设一个表头结点,包含链域(firstarc)指向链表中第一个结点,还设有存储顶点vi的名或其它有关信息的数据域(data)。如:,表结点,头结点,#define MAX_VERTEX_NUM 20 t
9、ypedef struct ArcNodeint adjvex; /该弧所指向的顶点的位置struct ArcNode *nextarc; /指向下一条弧的指针InfoType *info; /该弧相关信息的指针 ArcNode; typedef struct VNodeVertexType data; /顶点信息ArcNode *firstarc; /指向第一条依附该顶点的弧的指针 VNode,AdjListMAX_VERTEX_NUM; typedef struct AdjList vertices; /图的当前顶点数和弧数int vexnum,arcnum; /图的种类标志int kin
10、d; ALGraph;,三、十字链表是有向图的另一种链式存储结构,可以看作是将有向图的邻接表和逆邻接表结合起来的一种链表。弧结点 顶点结点 四、邻接多重表是无向图的另一种链式存储结构。边结点 顶点结点,7.3图的遍历 一、深度优先搜索遍历类似树的先根遍历,是其推广.假设初始状态是图中所有顶点未曾被访问,则可从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止.,假定输入边的数据为: (0,1),(0,2),(1
11、,3),(1,4),(2,5),(2,6),(3,7),(4,7),(5,6) 深度优先搜索遍历的结果序列是:0,2,6,5,1,4,7,3。,二、广度优先搜索遍历类似树的按层次遍历的过程.假设从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问的顶点的邻接点,然后分别从这些邻接点出发依次访问他们的邻接点,并使”先被访问的顶点的邻接点”先于”后被访问的顶点的邻接点”被访问,直至图中所有已被访问的顶点的邻接点都被访问到.若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止,74 图的连通性问题 一、无向图的连通分量和生成树对无向图
12、进行遍历时,对于连通图,仅需从图中任一顶点出发,进行深度优先搜索或广度优先搜索,便可访问到图中所有顶点。对非连通图,则需从多个出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量中的顶点集。由深度优先搜索得到的为深度优先生成树;由广度优先搜索得到的为广度优先生成树。,三、最小生成树用连通网来表示n个城市以及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋予边的权值表示相应的代价。对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以是一个通信网,现在要选择这样一棵生成树,是使总的耗费最少。这个问题就是构造连通网的最
13、小代价生成树(最小生成树)的问题。一棵生成树的代价就是树上各边的代价之和。构造最小生成树有多种算法,多数利用了最小生成树的下列一种简称为MST的性质:假设N=(V,E)是一个连通网,U是顶点集V的一个非空子集。若(u,v)是一条具有最小权值(代价)的边,其中u属于U,v属于V U,则必存在一棵包含边(u,v)的最小生成树。普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法是两个利用MST性质构造最小生成树的算法。,一、普里姆(Prim)算法,图6-8,图6-9,二、克鲁斯卡尔(Kruskal)算法,图6-10,#define M 50 /*图中最大边数*/ int find (char
14、s, char ch) /*查找字符串s中,是否包含字符ch */ char *p; for (p=s;*p!=0;p+)if (*p=ch) return 1; return 0; 算法 6.6 如书第179页所示,7.5最短路径 751从某个源点到其余各顶点的最短路,图6-11,定义辅助数组的存储结构: typedef struct char vexN; /*路径上的顶点集合*/int totalweight; /*路径长度*/ PATH;,图6-12,算法 6.7如书第183页所示,算法 6.8如书第185页所示,图6-13,652每一对顶点间的最短路径 定义二维辅助数组的元素类型如下:
15、 typedef struct char vexN;int totalweight;PATH;,图6-14,75有向无环图及其应用 一、拓扑排序由某个集合上的一个偏序得到集合上的一个全序,这个操作 称之为拓扑排序。全序称为拓扑有序,由偏序定义得到拓扑有序的操作便是拓 扑排序。一个表示偏序的有向图可用来表示一个流程图,施工流程 图,产品生产流程图,数据流图等。图中每一条有向边表示两个 子工程之间的次序关系(领先关系)。例:一个软件专业的学生必须学习一系列基本课程,课程之间有领先(优先)关系。,图中顶点表示课程,有向边(弧)表示先决条件这种用顶点表示活动,用弧表示活动间的优先关系的有向图称为顶点表
16、示活动的网,简称AOV网。在AOV网中不应该出现有向环,因为存在环意味着某项活动应以自己为先决条件。因此,对给定的AOV网应首先判定网中是否存在环。检测的办法是对有向图构造其顶点的拓扑有序序列,若图中所有顶点都在它的拓扑有序序列中,则该AOV网中必定不存在环。进行拓扑排序的办法:(1)在有向图中选一个没有前驱的顶点且输出之。(2)从图中删除顶点和所有以它为尾的弧。重复以上两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。,图6- 17,二、关键路径边表示活动的网(AOE网)是一个带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续的时间。 AOE网可用来估算工程的完成时间。,对AOE网要研究的问题是: (1)完成整项工程至少需要多少时间? (2)那些活动是影响工程进度的关键?,网的关键路径:,算法 6.12如书第198页所示,