数据结构图PPT课件.ppt
《数据结构图PPT课件.ppt》由会员分享,可在线阅读,更多相关《数据结构图PPT课件.ppt(49页珍藏版)》请在三一文库上搜索。
1、数据结构 与 算法第七讲:图开场白10/07/20252内容提要v图的定义v图的存储结构v图的遍历v最小生成树v最短路径v拓扑排序v关键路径10/07/20253图的定义10/07/20254v图(Graph)是由顶点的有穷集合和顶点之间的边的集合组成,通常表示为:G(V,E),其中 G 表示一个图,V 是图 G 中顶点的集合,E 是图 G 中边的集合。123576984图的术语(一)v图按有无方向分为无向图和有向图。无向图由顶点和边构成,有向图由顶点和弧构成。弧有弧头和弧尾之分。v图按照边或弧的多少分稀疏图和稠密图。如果任意两个顶点之间都存在边叫完全图,有向的叫有向完全图。若无重复的边或顶点
2、到自身的边则叫简单图。v图中顶点之间有邻接点、依附的概念。无向图顶点的边数叫做度,有向图顶点分为入度和出度。v图上的边或弧上带权则称为网。10/07/20255ABDCABDCABDC北京北京香港香港上海上海台北台北1463168012008087002160图a图b图c图d图的术语(二)10/07/20256v图中顶点存在路径,两顶点存在路径则说明是连通的,如果路径最终回到起始点则称为回路或环,当中不重复叫简单路径。若任意两顶点都是连通的,则图就是连通图,有向则称强连通图。图中有子图,若子图极大连通则就是连通分量,有向则称强连通分量。ABDCABDC图a图b图c思考1:图b是强连通图吗?图c
3、呢?ADCABDC图fEFABC图dEF图e思考2:图d是图f的连通分量吗?图的术语(三)10/07/20257v无向图中连通且n个顶点n-1条边叫生成树。有向图中一顶点入度为0其余顶点入度为1的叫有向树。一个有向图由若干棵有向树构成生成森林。ABDC图aFEGHABDC图bFEGHABDC图cFEGHABDC图dGEFABDC图eGEF图f图的抽象数据类型10/07/20258ADT 图(Graph)Data 顶点的有穷集合和边的集合。Operation CreateGraph(&G,V,E):按照顶点集V和边弧集E的定义构造图G。DestroyGraph(&G):图G存在则销毁。Locat
4、eVex(G,u):若图G中存在顶点u,则返回图中的位置。GetVex(G,v):返回图G中顶点v的值。PutVex(G,v,value):将图G中顶点v赋值为value。FirstAdjVex(G,&v):返回顶点v的一个邻接顶点,若顶点在G中无邻接顶点返回空。NextAdjVex(G,v,&w):返回顶点v相对于顶点w的下一个邻接顶点,若w是v的最后 一个邻接点则返回空。InsertVex(&G,v):在图G中增添新顶点v。DeleteVex(&G,v):删除图G中顶点v及其相关的弧。InsertArc(&G,v,w):在图G中增添弧,若G是无向图,还需要增添对称弧 DeleteArc(&
5、G,v,w):在图G中删除弧,若G是无向图,还需要删除对称弧 DFSTraverse(G):对图G进行深度优先遍历。HFSTraverse(G):对图G进行广度优先遍历。endADT内容提要v图的定义v图的存储结构v图的遍历v最小生成树v最短路径v拓扑排序v关键路径10/07/20259图的存储结构v相较于线性表和树,图的存储结构更加复杂v下面4个图是一样的吗?10/07/202510ABDCFEGHFGEHADBCGFHEADBCFGEHADBCv顺序存储的问题:物理位置无法表示元素间关系。v多重链表的问题:每个顶点的指针域个数难以选择。图的存储结构:邻接矩阵(一)v邻接矩阵:一维数组存顶点
6、信息,二维数组存边信息10/07/202511V1的度为2主对角线V1的出度为2V1的入度为1V0V3V2V1V0V1V2V3V0V1V2V3V0V1V2V3顶点数组边数组无向图V0V3V2V1V0V1V2V3V0V1V2V3V0V1V2V3顶点数组边数组有向图图的存储结构:邻接矩阵(二)10/07/202512V0V4V1V3V2962351V0V1V2V3顶点数组V4V0V1V2V3V4V0V1V2V3V4边数组有向网图/*无向网图的邻接矩阵表示*/1.typedef char VertexType;2.typedef int EdgeType;3.#define MAXVEX 1004.
7、define INFINITY 655355.typedef struct 6.VertexType vexsMAXVEX;7.EdgeType arcMAXVEXMAXVEX;8.int numVertexes,numEdges;9.MGraph;10.void CreateMGraph(MGraph G)11.int i,j,k,w;12.printf(输入顶点数和边数:n);13.scanf(%d,%d,&G.numVertexes,&G.numEdges);14.for(i=0;iG.numVertexes;i+)15.scanf(%c,&G.vexsi);16.for(i=0;iG
8、numVertexes;i+)17.for(j=0;jG.numVertexes;j+)18.G.arcij=INFINITY;19.for(k=0;kG.numEdges;k+)20.printf(输入边(vi,vj)的下标i,j和权w:n);21.scanf(%d,%d,%d,&i,&j,&w);22.G.arcij=w;23.G.arcji=G.arcij;24.25.时间复杂度:O(n+n2+e)思考:邻接矩阵的缺点?图的存储结构:邻接表(一)v邻接表:一维数组存顶点(包括数据和指向第一个邻接点的指针),每个顶点vi的所有邻接点构成一个单链表10/07/202513V0V3V2V1无
9、向图下标0123120V0V1V2V3datafirstedgeadjvexnext3201302V0V3V2V1有向图下标012330V0V1V2V3datafirstedgeadjvexnext201下标012312V0V1V2V3datafirstedgeadjvexnext120思考:如何知道某结点的度?如何判断某条边是否存在?如何求一个顶点的所有邻接点?图的存储结构:邻接表(二)10/07/202514V0V4V1V3V2962351有向网图1.typedef char VertexType;2.typedef int EdgeType;3.typedef struct EdgeNo
10、de4.5.int adjvex;6.EdgeType weight;7.struct EdgeNode*next;8.EdgeNode;9.typedef struct VertexNode10.11.VertexType data;12.EdgeNode*firstedge;13.VertexNode,AdjListMAXVEX;14.typedef struct15.16.AdjList adjList;17.int numVertexes,numEdges;18.GraphAdjList;下标012340V0V1V2V3datafirstedgeadjvexnext0344V46921
11、523weight图的存储结构:邻接表(三)10/07/2025151.void CreateALGraph(GraphAdjList&G)/*建立无向图的邻接表结构*/2.int i,j,k;3.EdgeNode*e;4.printf(输入顶点数和边数:n);5.scanf(%d,%d,&G.numVertexes,&G.numEdges);6.for(i=0;iG.numVertexes;i+)/读入顶点信息,建立顶点表7.scanf(%c,&G.adjListi.data);/输入顶点信息8.G.adjListi.firstedge=NULL;/将边表置为空表9.10.for(k=0;k
12、adjvex=j;/邻接序号为j15.e-next=G.adjListi.firstedge;/将e指针指向当前顶点指向的结点16.G.adjListi.firstedge=e;/将当前顶点的指针指向e17.18.e=(EdgeNode*)malloc(sizeof(EdgeNode);/生成边表结点19.e-adjvex=i;/邻接序号为i20.e-next=G.adjListj.firstedge;/将e指针指向当前顶点指向的结点21.G.adjListj.firstedge=e;/将当前顶点的指针指向e22.23.时间复杂度:O(n+e)图的存储结构:十字链表v十字链表:有向图的优化,把
13、邻接表和逆邻接表结合起来。10/07/202516V0V3V2V1有向图datafirstinfirstoutheadvextailvexheadlinktaillink顶点表结点结构边表结点结构下标012330V0V1V2V3datafirstedgeadjvexnext201创建算法的时间复杂度:O(n+e)注意:虚线箭头其实就是逆邻接表的表示下标012301V0V1V2V3datafirstinheadvextailvex23001221firstoutheadlinktaillinkV0有两个入边,所以在v0的firstin指向v1后,v1的headlink指向v2,v2后再无v0的入
14、边顶点,所以其taillink为空V1有两个出边,所以在v1的firstout指向v0后,taillink指向v2和当前顶点下标相同(4)(5)(2)(3)(1)图的存储结构:邻接多重表v邻接多重表:无向图的优化,原来用两个结点表示的一条边,现在用一个结点表示10/07/202517V0V3V2V1无向图下标0123120V0V1V2V3datafirstedgeadjvexnext3201302ivexilinkjvexjlink边表结点结构下标0123011V0V1V2V3datafirstedgeivexilink2233002jvexjlink(1)(2)(3)(4)(5)(6)(7)
15、8)(9)(10)图的存储结构:边集数组v边集数组:两个一维数组。一个存储顶点的信息;另一个存储边的信息,边数组每个数据元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成。10/07/202518V0V4V1V3V2962351V0V1V2V3顶点数组V4有向网图beginendweightedges0046edges1109edges2123edges3235edges4341edges5202边数组typedef struct int begin;int end;int weight;Edge;内容提要v图的定义v图的存储结构v图的遍历v最小生成树v最短路径
16、v拓扑排序v关键路径10/07/202519图的遍历v你经常找不到钥匙吗?v图的遍历q从图中某一顶点出发 访遍图中其余顶点,且使每一个顶点仅被 访问一次v两种方法:o深度优先遍历o广度优先遍历10/07/202520你玩游戏的时候讨厌走迷宫吗?深度优先遍历(Depth First Search)10/07/202521ABFGHEDICABFCIGDIEHGIFHAGBDHDEBCADEFGHIv从图中某个顶点v出发,访问此顶点,然后从v的未访问的邻接点出发,深度优先遍历图,直至图中所有和v有路径相同的顶点都被访问到。对于非连通图,则需要对它的连通分量分别进行深度优先遍历。注意:是否与树的某个
17、次序遍历相似?邻接矩阵结构的深度优先遍历实现10/07/2025221.#define TRUE 12.#define FALSE 03.typedef int Boolean;/*Boolean是布尔类型,其值是TRUE或FALSE*/4.Boolean visitedMAX;/*访问标志的数组*/5./*邻接矩阵的深度优先递归算法*/6.void DFS(MGraph G,int i)7.int j;8.visitedi=TRUE;9.printf(%c,G.vexsi);/*打印顶点,也可以为其他操作*/10.for(j=0;jG.numVertexes;j+)11.if(G.arcij
18、1&!visitedj)12.DFS(G,j);/*对未访问过的邻接顶点递归调用*/13.14./*邻接矩阵的深度优先遍历操作*/15.void DFSTraverse(MGraph G)16.int i;17.for(i=0;iG.numVertexes;i+)18.visitedi=FALSE;/*初始化所有顶点状态,都是未访问过状态*/19.for(i=0;iadjvex)9.DFS(GL,p-adjvex);/*对未访问的邻接顶点递归调用*/10.p=p-next;11.12.13./*邻接表的深度优先遍历操作*/14.void DFSTraverse(GraphAdjList GL
19、)15.int i;16.for(i=0;iGL.numVertexes;i+)17.visitedi=FALSE;/*初始化所有顶点状态,都是未访问过状态*/18.for(i=0;iGL.numVertexes;i+)19.if(!visitedi)/*对未访问过的顶点调用DFS,若是连通图,只会执行一次*/20.DFS(GL,i);21.时间复杂度:O(n+e)广度优先遍历(Breath First Search)10/07/202524ABFGHEDICABFGHEDICFCIGABFCIGEEDHDIGEDHGEDH(1)(2)(3)(4)(5)(6)(7)(8)(9)出队列入队列邻接
20、矩阵结构的广度优先遍历实现10/07/2025251.void BFSTraverse(MGraph G)/*邻接矩阵的广度优先遍历算法*/2.int i,j;Queue Q;3.for(i=0;iG.numVertexes;i+)4.visitedi=FALSE;5.InitQueue(&Q);/*初始化一辅助用的队列*/6.for(i=0;iG.numVertexes;i+)/*对每一个顶点做循环*/7.if(!visistedi)8.visistedi=TRUE;/*若是未访问过就处理*/9.printf(%c,G.vexsi);/*打印顶点,也可为其他操作*/10.Enqueue(&Q
21、i);/*将此顶点入队列*/11.while(!QueueEmpty(Q)12.Dequeue(&Q,&i);/*将队中元素出队列,赋值给i*/13.for(j=0;jG.numVertexes;j+)14.if(G.arcij=1&!visitedj)15.visitedj=TRUE;16.printf(%c,G.vexsj);17.EnQueue(&Q,j);18.19.20.21.22.23.时间复杂度:O(n2)邻接表结构的广度优先遍历实现10/07/2025261.void BFSTraverse(GraphAdjList GL)/*邻接表的广度优先遍历算法*/2.int i;Ed
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 结构图 PPT 课件
