《数据结构教学课件》第09章.ppt
《《数据结构教学课件》第09章.ppt》由会员分享,可在线阅读,更多相关《《数据结构教学课件》第09章.ppt(115页珍藏版)》请在三一办公上搜索。
1、第9章 图,图的基本概念图的存储结构图的实现图的遍历最小生成树最短路径拓扑排序 关键路径,主要知识点,教学计划编排问题 一个教学计划包含许多课程,在教学计划包含的许多课程之间,有些课程之间有先修和后续的关系,有些课程可以任意安排次序。,教学计划编排问题(图形结构)各课程之间的次序关系可用一个称作图的数据结构来表示,如课程之间优先关系有向图。有向图中的每个顶点表示一门课程,如果从顶点vi到vj之间存在有向边,则表示课程i必须先于课程j进行。,课程之间优先关系的有向图,9.1 图,1.图的基本概念,图是由顶点集合及顶点间的关系集合组成的一种数据结构。图G的定义是:G=(V,E),其中,V=x|x某
2、个数据元素集合E=(x,y)|x,yV或E=x,y|x,yV并且Path(x,y)其中,(x,y)表示从 x到 y的一条双向通路,即(x,y)是无方向的;Path(x,y)表示从 x到 y的一条单向通路,即Path(x,y)是有方向的。问题:图的特点,图有许多复杂结构,本课程只讨论最基本的图,因此,本章讨论的图中不包括存在从自身到自身的边的图,以及多条边的图,带自身环的图,多重图,基本术语:,(1)顶点和边:图中的结点一般称作顶点,图中的第i个顶点记做vi。两个顶点vi和vj相关联称作顶点vi和vj之间有一条边,图中的第k条边记做ek,ek=(vi,vj)或vi,vj。,(2)有向图和无向图:
3、在有向图中,顶点对x,y是有序的,顶点对x,y称为从顶点x到顶点y的一条有向边,有向图中的边也称作弧;在无向图中,顶点对(x,y)是无序的,顶点对(x,y)称为与顶点x和顶点y相关联的一条边。,(3)完全图:在有n个顶点的无向图中,若有n(n-1)/2条边,即任意两个顶点之间有且只有一条边,则称此图为无向完全图;在有n个顶点的有向图中,若有n(n-1)条边,即任意两个顶点之间有且只有方向相反的两条边,则称此图为有向完全图,无向完全图,不是无向完全图,有向完全图,不是有向完全图,(4)邻接顶点:在无向图G中,若(u,v)是E(G)中的一条边,则称u和v互为邻接顶点,并称边(u,v)依附于顶点u和
4、v;在有向图G中,若u,v是E(G)中的一条边,则称顶点u邻接到顶点v,顶点v邻接自顶点u,并称边u,v和顶点u和顶点v相关联。,(5)顶点的度:顶点v的度是与它相关联的边的条数,记作TD(v)。有向图:顶点的度=入度+出度。入度ID(v)定义为以顶点v为终点的有向边的条数;出度OD(v)定义为以顶点v为起点的有向边的条数;无向图:TD(v)=ID(v)=OD(v),(6)路径:在图G=(V,E)中,若从顶点vi出发有一组边使可到达顶点vj,则称顶点vi到顶点vj的顶点序列为从顶点vi到顶点vj的路径.,从顶点0到顶点3的路径?如图G1中:,顶点3,顶点0,顶点2,顶点0,顶点3,(7)权:有
5、些图的边附带有数据信息,这些附带的数据信息称为权。带权的图也称作网络或网。,(8)路径长度:对于不带权的图,一条路径的路径长度是指该路径上的边的条数;对于带权的图,一条路径的路径长度是指该路径上各个边权值的总和。,(9)子图:设有图G1=V1,E1和图G2=V2,E2,若V1V2,且E1 E2,则称图G2是图G1的子图。,图G2,图G1,(10)连通图和强连通图:在无向图中,若从顶点vi到顶点vj有路径,则称顶点vi和顶点vj是连通的。如果图中任意一对顶点都是连通的,则称该图是连通 图。在有向图中,若对于任意一对顶点vi和顶点vj(vivj)都存在路径,则称图G是强连通图。,不是强连通图,强连
6、通图,连通图,(11)生成树:一个连通图的最小连通子图称作该图的生成树。有n个顶点的连通图的生成树有n个顶点和n-1条边。生成树一般是对无向图来讨论。,图G2的生成树,(12)简单路径和回路:若路径上各顶点v1,v2,vm,互不重复,则称这样的路径为简单路径;若路径上第一个顶点v1与最后一个顶点vm重合,则称这样的路径为回路或环。,数据集合:由一组顶点集合vi和一组边ej集合组成。当为带权图时每条边上权wj还构成权集合wj。操作集合:(1)初始化Initiate(G,n)(2)插入顶点 InsertVertex(G,vertex)(3)插入边InsertEdgeG,v1,v2,weight)(
7、4)删除边DeleteEdge(G,v1,v2)(5)删除顶点DeleteVertex(G,vertex)(6)取第一个邻接顶点GetFirstVex(G,v)(7)取下一个邻接顶点GetNextVex(G,int v1,v2)(8)遍历DepthFirstSearch(G),2.图的抽象数据类型,9.2 图的存储结构,图的存储结构主要有邻接矩阵和邻接表两种。,1.图的邻接矩阵存储结构,假设图G=(V,E)有n个顶点,即V=v0,v1,vn-1,E可用如下形式的矩阵A描述,对于A中的每一个元素aij,满足:,由于矩阵A中的元素aij表示了顶点vi和顶点vj之间边的关系,或者说,A中的元素aij
8、表示了顶点vi和顶点vj(0jn-1)的邻接关系,所以矩阵A称作邻接矩阵。,无向图的邻接矩阵一定是对称矩阵,有向图的邻接矩阵一般是非对称矩阵,其中V表示了图的顶点集合,A表示了图的邻接矩阵,对于带权图,邻接矩阵定义为:,带权图及其邻接矩阵,其中V表示了图的顶点集合,A表示了图的邻接矩阵。对于带权图,邻接矩阵第i行中所有0aij的元素个数等于第i个顶点的出度,邻接矩阵第j列中所有0aij的元素个数等于第j个顶点的入度。,2.图的邻接表存储结构,当图的边数少于顶点个数且顶点个数值较大时,图的邻接nn矩阵的存储问题就变成了稀疏矩阵的存储问题,此时,邻接表就是一种较邻接矩阵更为有效的存储结构。,顶点信
9、息,顶点在数组中的下标,顶点的邻接顶点在数组中下标构成单链表的头指针,数组的data域存储图的顶点信息;sorce域存储该顶点在数组中的下标序号;adj域为该顶点的邻接顶点单链表的头指针。第i行单链表中的dest域存储所有起始顶点为vi的邻接顶点vj在数组中的下标序号,next域为单链表中下一个邻接顶点的指针域。如果是带权图,单链表中需再增加cost域,用来存储边的权值wij。,9.3 图的实现,1.邻接矩阵存储结构下图操作的实现,设图G=(V,E),V是顶点集可以用顺序表表示;,E是边集,刻画了顶点之间的关系,用邻接矩阵表示;,边的数量,当做整体,用一个变量表示,结构体变量,先定义相应的结构
10、体,事先确定顶点个数MaxVertices,结构体定义,#include SeqList.h struct SeqList Vertices;int edgeMaxVerticesMaxVertices;int numOfEdges;,一个图G可以用一个AdjMGraph类型的结构体变量或指针来表示。定义语句为:AdjMGraph G,*G1;,typedef,AdjMGraph,void Initiate(AdjMGraph*G,int n)int i,j;ListInitiate(/*边的条数置为0*/,初始化G,对于给定的图G,给定一个AdjMGraph类型的结构体变量或指针。定义语句为
11、:AdjMGraph G;,初始化顺序表成员,初始化顶点关系成员,初始化边数成员,给定一个AdjMGraph类型的结构体变量或指针。定义语句为:AdjMGraph*G;,void InsertVertex(AdjMGraph*G,DataType vertex)ListInsert(,在给定的图G中插入顶点,给定一个AdjMGraph类型的结构体变量或指针。语句为:AdjMGraph G;,给定一个AdjMGraph类型的结构体变量或指针。语句为:AdjMGraph*G;,给定顶点,顶点插入操作,就是对AdjMGraph类型的结构体变量中的成员Vertices插入数据,也就是顺序表的插入操作,
12、G-Vertices.size,在给定的图G中插入边,给定一个AdjMGraph类型的结构体变量或指针。语句为:AdjMGraph G;,给定一个AdjMGraph类型的结构体变量或指针。语句为:AdjMGraph*G;,给定边,边插入操作,就是对AdjMGraph类型的结构体变量中的成员edges插入数据,也就是修改二维数组操作,AdjMGraph类型的结构体变量中的成员edges插入数据导致边数的增加,因此还需要修改成员Numofedges的值,给定边两个邻接顶点在顺序表中的位置标号,void InsertEdge(AdjMGraph*G,int v1,int v2,int weight)
13、if(_)printf(参数v1或v2越界出错!n);exit(1);G-edgev1v2=weight;G-numOfEdges+;,插入边操作,v1=G-Vertices.size|v2=G-Vertices.size,void DeleteEdge(AdjMWGraph*G,int v1,int v2)if(v1=G-Vertices.size|v2=G-Vertices.size|v1=v2)printf(参数v1或v2越界出错!n);exit(1);if(_)printf(该边不存在!n);exit(0);G-edgev1v2=MaxWeight;G-numOfEdges-;,删除边
14、操作,G-edgev1v2=MaxWeight|v1=v2,int GetFirstVex(AdjMGraph G,int v)int col;if(v)printf(参数v1越界出错!n);exit(1);for(col=0;col 0,取第一个邻接顶点,大于0并且小于MaxWeight?,int GetNextVex(AdjMGraph G,int v1,int v2)int col;if(v1=|v2=)printf(参数v1或v2越界出错!n);exit(1);for(col=v2+1;col 0,大于0并且小于MaxWeight?,取下一个邻接顶点,2.邻接矩阵图操作的测试,例9-1
15、 以下图所示的带权有向图为例编写测试邻接矩阵图的程序。,边的权值,边的起点,边的终点,顶点存储在一个字符数组中,边信息存储在一个结构数组中,图的创建函数设计如下:边信息结构体定义typedef struct int row;/行下标 int col;/列下标 int weight;/权值 RowColWeight;,创建该图,对一个AdjMGraph类型的结构变量插入顶点和边,void CreatGraph(AdjMGraph*G,DataType V,int n,RowColWeight E,int e)/*在图G中插入n个顶点信息V和e条边信息E*/int i,k;Initiate(G,n
16、);/*初始化n个顶点的图*/for(i=0;i n;i+)InsertVertex(G,Vi);/*顶点插入*/for(k=0;k e;k+)InsertEdge(G,Ek.row,Ek.col,Ek.weight);/*边插入*/,图的创建函数,图存放的AdjMGraph类型的指针变量,顶点和顶点数,边信息和边数,测试程序设计如下:#include#include typedef char DataType;#define MaxSize 100#define MaxVertices 10#define MaxEdges 100#define MaxWeight 10000#include
17、 AdjMGraph.h#include AdjMGraphCreate.h,void main(void)AdjMWGraph g1;DataType a=A,B,C,D,E;RowColWeight rcw=0,1,10,0,4,20,1,3,30,2,1,40,3,2,50;int n=5,e=5;int i,j;CreatGraph(,2.邻接表存储结构下图操作的实现,三个成员:data,source,单链表头指针adj,两个成员:下标dest,下一个结点指针next,2.邻接表存储结构下图操作的实现,邻接表的存储结构typedef struct Nodeint dest;/*邻接边的
18、弧头顶点序号*/struct Node*next;Edge;/*邻接边单链表的结点结构体*/typedef structDataType data;/*顶点数据元素*/int sorce;/*邻接边的弧尾顶点序号*/Edge*adj;/*邻接边的头指针*/AdjLHeight;/*数组的数据元素类型结构体*/,typedef struct AdjLHeight aMaxVertices;/*邻接表数组*/int numOfVerts;/*顶点个数*/int numOfEdges;/*边个数*/AdjLGraph;/*邻接表结构体*/讨论:图操作的实现方法,一个邻接表用一个AdjLGragph类
19、型的指针变量表示,定义语句为:AdjLGraph*G;,0,1,2,i,MaxVertices,3.插入第i个顶点,i?,AdjLGraph*G,ai,data,0,1,2,v1,MaxVertices,4.插入边,v1,v2是否在numOfVerts范围内?,已知顶点v1和v2,adj,p,v2,修改边数,0,1,2,v1,MaxVertices,5.删除边,v1,v2是否在numOfVerts范围内?,已知顶点v1和v2,adj,查找v2?,curr,只要curr存在且其dest值!=v2则curr下移一个,一般需要记录curr的前一个,引入pre,curr,pre,找完,分为三种情况.在
20、第一个.不是第一个.其他,0,1,2,v,MaxVertices,6.取第一个邻接顶点,v是否在numOfVerts范围内?,已知顶点v,adj,邻接表存储结构下的图的定义和操作测试参见具体程序:GraphTest.c,9.4 图的遍历,1.图的深度和广度优先遍历算法,图的遍历是访问图中的每一个顶点且每个顶点只被访问一次.图遍历方法深度优先遍历广度优先遍历算法设计需要考虑三个问题:算法的参数要指定访问的第一个顶点;要考虑遍历路径可能出现的死循环问题;要使一个顶点的所有邻接顶点按照某种次序被访问。,一、图的深度优先遍历算法,图的深度优先遍历算法是遍历时深度优先的算法;图的深度优先遍历是指在图的所
21、有邻接顶点中,每次都在访问 完当前顶点之后,接着首先访问当前顶点的第一个邻接顶点。图的深度优先遍历算法是一个函数递归调用算法。,开始,选择初始顶点v,0,取v的第一个邻接顶点w,w访问?,取v的邻接顶点w的下一个邻接顶点w,结束,0,w存在否,按深度优先遍历访问w,1,访问和标记v已访问,连通图的深度优先遍历算法为:,对于例9-8所示的有向图,顶点A作为初始访问结点,深度优先遍历访问顶点次序为:A B D C E,同一个路径顶点优先,二、图的广度优先遍历算法,图的广度优先遍历算法是一个分层搜索的过程,需要一个队列以保持访问过的顶点的顺序,以便按访问过的顶点的顺序来访问这些顶点的邻接顶点。连通图
22、的广度优先遍历算法为:,图的广度优先遍历是指从指定的顶点开始,按照到该顶点 路径长度由短到长的顺序,依次访问图中的其余顶点。,开始,选择初始顶点v,顶点入队列Q,Q的队头元素u出队,Q空否,0,寻找u的第一个邻接顶点w,w访问?,取u的邻接顶点w的下一个邻接顶点w,1,结束,0,w存在否,访问和标记w已访问,0,1,访问和标记v已访问,对于例9-8所示的有向图,顶点A作为初始访问结点,广度优先遍历访问顶点次序为:A B E D C问题:图的(深度、广度)遍历和生成树的关系?,同一个顶点的邻接顶点优先,三、非连通图的遍历,对于非连通图,从图的任意一个顶点开始深度或广度优先遍历并不能访问图中的所有
23、顶点。只能访问和初始顶点连通的所有顶点。但是,每一个顶点都作为一次初始顶点进行深度优先遍历或广度优先遍历,并根据顶点的访问标记来判断是否需要访问该顶点,就一定可以访问非连通图中的所有顶点。,void DepthFSearch(AdjMWGraph G,int v,int visited,void Visit(DataType item)int w;Visit(G.Vertices.listv);visitedv=1;w=GetFirstVex(G,v);while(w!=-1)if(!visitedw)DepthFSearch(G,w,visited,Visit);w=GetNextVex(G
24、,v,w);,2.图的深度和广度优先遍历函数实现,一、连通图深度优先遍历,二、非连通图的深度优先遍历,void DepthFirstSearch(AdjMWGraph G,void Visit(DataType item)int i;int*visited=(int*)malloc(sizeof(int)*);for(i=0;i;i+)visitedi=0;for(i=0;i;i+)if(!visitedi)DepthFSearch(G,i,visited,Visit);free(visited);,思想:对图中每一个顶点作为初始顶点进行深度优先遍历,为了避免访问过的顶点重新被访问,引入标记指
25、针,对图中顶点进行循环,三、连通图的广度优先遍历,#include SeqQueue.hvoid BroadFSearch(AdjMWGraph G,int v,int visited,void Visit(DataType item)DataType u,w;SeqCQueue queue;Visit(G.Vertices.listv);visitedv=1;QueueInitiate(,void BroadFirstSearch(AdjMWGraph G,void Visit(DataType item)int i;int*visited=(int*)malloc(sizeof(int)*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构教学课件 数据结构 教学 课件 09
链接地址:https://www.31ppt.com/p-6039192.html