




已阅读5页,还剩141页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章 图,7.1 图的定义,术语,7.2 图的存储表示,7.3 图的遍历,7.4 图的连通性,最小生成树,7.5拓扑排序,关键路径,7.6 两点之间的最短路径问题,图是由一个顶点集 V 和一个弧集 VR构成的数据结构。 Graph = (V, VR )其中,VR| v,wV 且 P(v,w) 表示从 v 到 w 的一条弧,并称 v 为弧尾(初始点),w 为弧头(终端点)。 谓词 P(v,w) 定义了弧 的意义或信息。,图的结构定义:,由于“弧”是有方向的,因此称由顶点集和弧集构成的图为有向图。,例如:,G1 = (V1, VR1),其中V1=A, B, C, D, EVR1=, , , , , , ,若VR 必有VR, 则称 (v,w) 为顶点 v 和顶点 w 之间存在一条边。由顶点集和边集构成的图称作无向图。,例如: G2=(V2,VR2)V2=A, B, C, D, E, FVR2=(A, B), (A, E), (B, E), (C, D), (D, F), (B, F), (C, F) ,名词和术语,邻接点、度、入度、出度,路径、路径长度、简单路径、简单回路,连通图、连通分量、强连通图、强连通分量,生成树、生成森林,完全图、稀疏图、稠密图,网、子图,B,设图G=(V,VR) 和图 G=(V,VR),且 VV, VRVR,则称 G 为 G 的子图。,15,9,7,21,11,3,2,弧或边带权的图分别称作有向网或无向网。,假设图中有 n 个顶点,e 条边,则,含有 e=n(n-1)/2 条边的无向图称作完全图;,含有 e=n(n-1) 条弧的有向图称作 有向完全图;,若边或弧的个数 enlogn,则称作稀疏图,否则称作稠密图。,假若顶点v 和顶点w 之间存在一条边,则称顶点v 和w 互为邻接点,,例如:,ID(B) = 3,ID(A) = 2,边(v,w) 和顶点v 和w 相关联。 和顶点v 关联的边的数目定义为边的度。,右侧图中,顶点的出度: 以顶点v 为弧尾的弧的数目;,对有向图来说,,顶点的入度: 以顶点v为弧头的弧的数目。,顶点的度(TD)=出度(OD)+入度(ID),例如:,ID(B) = 2,OD(B) = 1,TD(B) = 3,由于弧有方向性,则有入度和出度之分,设图G=(V,VR)中的一个顶点序列 u=vi,0,vi,1, , vi,m=w中,(vi,j-1,vi,j)VR 1jm,则称从顶点u 到顶点w 之间存在一条路径。路径上边的数目称作路径长度。,如:从A到F长度为 3 的路径A,B,C,F,简单路径:指序列中顶点不重复出现的路径。,简单回路:指序列中第一个顶点和最后一个顶点相同的路径。,若无向图G中任意两个顶点之间都有路径相通,则称此图为连通图;,若无向图为非连通图,则图中各个极大连通子图称作此图的连通分量。,若任意两个顶点之间都存在一条有向路径,则称此有向图为强连通图。,对有向图,,否则,其各个极大强连通子图称作它的强连通分量。,假设一个连通图有 n 个顶点和 e 条边,其中 n-1 条边和 n 个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树。,对非连通图,则称由各个连通分量的生成树的集合为此非连通图的生成森林。,7.2 图的存储表示,一、图的数组(邻接矩阵)存储表示,二、图的邻接表存储表示,三、有向图的十字链表存储表示,四、无向图的邻接多重表存储表示,一、图的数组(邻接矩阵)存储表示,定义:矩阵的元素为,有向图的邻接矩阵为非对称矩阵,特点:无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2有向图邻接矩阵不一定对称;有n个顶点的有向图需存储空间为n无向图中顶点Vi的度TD(Vi)是邻接矩阵A中第i行元素之和有向图中,顶点Vi的出度是A中第i行元素之和顶点Vi的入度是A中第i列元素之和网络的邻接矩阵可定义为:,typedef struct ArcCell / 弧的定义 VRType adj; / VRType是顶点关系类型。 / 对无权图,用1或0表示相邻否; / 对带权图,则为权值类型。 InfoType *info; / 该弧相关信息的指针 ArcCell, AdjMatrixMAX_VERTEX_NUM MAX_VERTEX_NUM;,typedef struct / 图的定义 VertexType / 顶点信息 vexsMAX_VERTEX_NUM; AdjMatrix arcs; / 弧的信息 int vexnum, arcnum; / 顶点数,弧数 GraphKind kind; / 图的种类标志 MGraph;,二、图的邻接表 存储表示,有向图的邻接表,可见,在有向图的邻接表中不易找到指向该顶点的弧,特点无向图中顶点Vi的度为第i个单链表中的结点数有向图中顶点Vi的出度为第i个单链表中的结点个数顶点Vi的入度为整个单链表中邻接点域值是i的结点个数,有向图的逆邻接表,A B C D E,3,0,3,4,2,0,01234,在有向图的邻接表中,对每个顶点,链接的是指向该顶点的弧,1,typedef 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; / 图的种类标志 ALGraph;,图的结构定义(邻接表),三、有向图的十字链表存储表示,0 1 2,弧的结点结构,指向下一个有相同弧尾的结点,指向下一个有相同弧头的结点,typedef struct ArcBox / 弧的结构表示 int tailvex, headvex; InfoType *info; struct ArcBox *hlink, *tlink; VexNode;,tailvex,headvex,hlink,tlink,info,顶点的结点结构,指向该顶点的第一条入弧,指向该顶点的第一条出弧,typedef struct VexNode / 顶点的结构表示 VertexType data; ArcBox *firstin, *firstout; VexNode;,data,firstin,firstout,typedef struct VexNode xlistMAX_VERTEX_NUM; / 顶点结点(表头向量) int vexnum, arcnum; /有向图的当前顶点数和弧数 OLGraph;,有向图的结构表示(十字链表),四、无向图的邻接多重表存储表示,typedef struct / 邻接多重表 VexBox adjmulistMAX_VERTEX_NUM; int vexnum, edgenum; AMLGraph;,无向图的结构表示,7.3 图的遍历,从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程。,深度优先搜索,广度优先搜索,从图中某个顶点V0 出发,访问此顶点,然后依次从V0的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V0有路径相通的顶点都被访问到。,一、深度优先搜索遍历图,连通图的深度优先搜索遍历,深度遍历:V1 V2 V4 V8 V5 V6 V3 V7,W1、W2和W3 均为 V 的邻接点,SG1、SG2 和 SG3 分别为含顶点W1、W2和W3 的子图。,访问顶点 V ;for (W1、W2、W3 ) 若该邻接点W未被访问, 则从它出发进行深度优先搜索遍历。,从上页的图解可见:,1. 从深度优先搜索遍历连通图的过程类似于树的先根遍历;,解决的办法是:为每个顶点设立一个 “访问标志 visitedw”;,2. 如何判别V的邻接点是否被访问?,void DFS(Graph G, int v) / 从顶点v出发,深度优先搜索遍历连通图 G visitedv = TRUE; VisitFunc(v); for(w=FirstAdjVex(G, v); w!=0; w=NextAdjVex(G,v,w) if (!visitedw) DFS(G, w); / 对v的尚未访问的邻接顶点w / 递归调用DFS / DFS,首先将图中每个顶点的访问标志设为 FALSE, 之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。,非连通图的深度优先搜索遍历,void DFSTraverse(Graph G, Status (*Visit)(int v) / 对图 G 作深度优先遍历。 VisitFunc = Visit; for (v=0; vG.vexnum; +v) visitedv = FALSE; / 访问标志数组初始化 for (v=0; vw1, V-w2, V-w8 的路径长度为1;,V-w7, V-w3, V-w5 的路径长度为2;,V-w6, V-w4 的路径长度为3。,w1,V,w2,w7,w6,w3,w8,w5,w4,从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0有路径相通的顶点都被访问到。,若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。,广度遍历:V1 V2 V3 V4 V5 V6 V7 V8,void BFSTraverse(Graph G, Status (*Visit)(int v) for (v=0; vG.vexnum; +v) visitedv = FALSE; /初始化访问标志 InitQueue(Q); / 置空的辅助队列Q for ( v=0; vG.vexnum; +v ) if ( !visitedv) / v 尚未访问 / BFSTraverse, ,visitedv = TRUE; Visit(v); / 访问uEnQueue(Q, v); / v入队列while (!QueueEmpty(Q) DeQueue(Q, u); / 队头元素出队并置为u for(w=FirstAdjVex(G, u); w!=0; w=NextAdjVex(G,u,w) if ( ! visitedw) visitedw=TRUE; Visit(w); EnQueue(Q, w); / 访问的顶点w入队列 / if / while,7.4 (连通网的)最小生成树,假设要在 n 个城市之间建立通讯联络网,则连通 n 个城市只需要修建 n-1条线路,如何在最节省经费的前提下建立这个通讯网?,问题:,构造网的一棵最小生成树,即: 在 e 条带权的边中选取 n-1 条边(不构成回路),使“权值之和”为最小。,算法二:(克鲁斯卡尔算法),该问题等价于:,算法一:(普里姆算法),取图中任意一个顶点 v 作为生成树的根,之后往生成树上添加新的顶点 w。在添加的顶点 w 和已经在生成树上的顶点v 之间必定存在一条边,并且该边的权值在所有连通顶点 v 和 w 之间的边中取值最小。之后继续往生成树上添加顶点,直至生成树上含有 n个顶点为止。,算法一:普里姆算法,例如:,a,e,d,c,b,g,f,14,8,5,3,16,21,所得生成树权值和,= 14+8+3+5+16+21 = 67,在生成树的构造过程中,图中 n 个顶点分属两个集合:已落在生成树上的顶点集 U 和尚未落在生成树上的顶点集V-U ,则应在所有连通U中顶点和V-U中顶点的边中选取权值最小的边。,一般情况下所添加的顶点应满足下列条件:,普里姆(Prim)算法在所有uU,vV-U的边(u,v)E中,找一条代价最小的边(u0,v0)算法思想:设N=(V,E)是连通网,TE是N上最小生成树中边的集合初始令U=u0,(u0V), TE=将(u0,v0)并入集合TE,同时v0并入U重复上述操作直至U=V为止,则T=(V,TE)为N的最小生成树算法实现:图用邻接矩阵表示,设置一个辅助数组,对当前VU集中的每个顶点,记录和顶点集U中顶点相连接的代价最小的边:,struct VertexType adjvex; / U集中的顶点序号 VRType lowcost; / 边的权值 closedgeMAX_VERTEX_NUM;,a,e,d,c,b,a,a,a,19,14,18,14,例如:,e,12,e,e,8,16,8,d,3,d,d,7,21,3,c,5,5,void MiniSpanTree_P(MGraph G, VertexType u) /用普里姆算法从顶点u出发构造网G的最小生成树 k = LocateVex ( G, u ); for ( j=0; jG.vexnum; +j ) / 辅助数组初始化 if (j!=k) closedgej = u, G.arcskj.adj ; closedgek.lowcost = 0; / 初始,Uu for (i=0; iG.vexnum; +i) ,继续向生成树上添加顶点;,k = minimum(closedge); / 求出加入生成树的下一个顶点(k) printf(closedgek.adjvex, G.vexsk); / 输出生成树上一条边 closedgek.lowcost = 0; / 第k顶点并入U集 for (j=0; jG.vexnum; +j) /修改其它顶点的最小边 if (G.arcskj.adj closedgej.lowcost) closedgej = G.vexsk, G.arcskj.adj ;,考虑问题的出发点: 为使生成树上边的权值之和达到最小,则应使生成树中每一条边的权值尽可能地小。,算法二:克鲁斯卡尔算法,具体做法: 先构造一个只含 n 个顶点的子图 SG,然后从权值最小的边开始,若它的添加不使SG 中产生回路,则在 SG 上加上这条边,如此重复,直至加上 n-1 条边为止。,a,e,d,c,b,g,f,14,8,5,3,16,21,例如:,7,12,18,19,算法描述:,构造非连通图 ST=( V, ); k = i = 0; / k 计选中的边数 while (kadjvex; / 对i号顶点的每个邻接点的入度减1 if (!(-indegreek) Push(S, k); / 若入度减为0,则入栈 if (countG.vexnum) return ERROR; / 该有向图有回路 else return OK; / TopologicalSort,算法分析,求各顶点的入度时间:T(n)=O(e)搜索入度为0的顶点的时间:T(n)=O(n)拓扑排序:T(n)=O(n+e),检测AOV网中是否存在环方法:对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环.,7.5.2 关键路径问题提出,把工程计划表示为有向图,用顶点表示事件,弧表示活动;每个事件表示在它之前的活动已完成,在它之后的活动可以开始,例 设一个工程有11项活动,9个事件事件 V1表示整个工程开始事件V9表示整个工程结束问题:(1)完成整项工程至少需要多少时间? (2)哪些活动是影响工程进度的关键?,源点,汇点,定义AOE网(Activity On Edge)也叫边表示活动的网。AOE网是一个带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续时间路径长度路径上各活动持续时间之和关键路径路径长度最长的路径叫Ve(j)表示事件Vj的最早发生时间Vl(j)表示事件Vj的最迟发生时间e(i)表示活动ai的最早开始时间l(i)表示活动ai的最迟开始时间l(i)-e(i)表示完成活动ai的时间余量关键活动关键路径上的活动叫,即l(i)=e(i)的活动,问题分析如何找e(i)=l(i)的关键活动?,设活动ai用弧表示,其持续时间记为:dut()则有:(1)e(i)=Ve(j) (2)l(i)=Vl(k)-dut(),如何求Ve(j)和Vl(j)?,(1)从Ve(1)=0开始向前递推,(2)从Vl(n)=Ve(n)开始向后递推,求关键路径步骤求Ve(i)求Vl(j)求e(i)求l(i)计算l(i)-e(i),V1V2V3V4V5V6V7V8V9,064577161418,0668710161418,a1a2a3a4a5a6a7a8a9a10a11,算法实现以邻接表作存储结构从源点V0出发,令Ve0=0,按拓扑序列求各顶点的Vei从汇点Vn出发,令Vln=Ven,按逆拓扑序列求其余各顶点的Vli根据各顶点的Ve和Vl值,计算每条弧的ei和li,找出ei=li的关键活动,邻接表结点:typedef struct node int vex; /顶点域 int length; struct node *next; /链域JD;,表头结点:typedef struct tnode int vexdata; int in; /入度域 struct node *link; /链域TD;TD gM; /g0不用,算法描述输入顶点和弧信息,建立其邻接表计算每个顶点的入度对其进行拓扑排序排序过程中求顶点的Vei将得到的拓扑序列进栈按逆拓扑序列求顶点的Vli计算每条弧的ei和li,找出ei=li的关键活动,7.6 最短路径问题提出,用带权的有向图表示一个交通运输网,图中:顶点表示城市边表示城市间的交通联系权表示此线路的长度或沿此线路运输所花的时间或费用等问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中, 各边上权值之和最小的一条路径最短路径,求从某个源点到其余各点的最短路径每一对顶点之间的最短路径,从某个源点到其余各顶点的最短路径,13,8,13,19,21,20,求从源点到其余各点的最短路径的算法的基本思想:,迪杰斯特拉(Dijkstra)提出:依最短路径的长度递增的次序求得各条路径,源点,v1,其中,从源点到顶点v的最短路径是所有最短路径中长度最短者。,v2,迪杰斯特拉(Dijkstra)算法,在这条路径上,必定只含一条弧,并且这条弧的权值最小。,下一条路径长度次短的最短路径的特点:,路径长度最短的最短路径的特点:,它只可能有两种情况:或者是直接从源点到该点(只含一条弧); 或者是,从源点经过顶点v1,再到达该顶点(由两条弧组成)。,其余最短路径的特点:,再下一条路径长度次短的最短路径的特点:,它可能有三种情况:或者是,直接从源点到该点(只含一条弧); 或者是,从源点经过顶点v1,再到达该顶点(由两条弧组成);或者是,从源点经过顶点v2,再到达该顶点。,它或者是直接从源点到该点(只含一条弧); 或者是,从源点经过已求得最短路径的顶点,再到达该顶点。,迪杰斯特拉(Dijkstra)算法思想,按路径长度递增次序产生最短路径算法:把V分成两组:(1)S:已求出最短路径的顶点的集合(2)V-S=T:尚未确定最短路径的顶点集合将T中顶点按最短路径递增的次序加入到S中,保证:(1)从源点V0到S中各顶点的最短路径长度都不大于 从V0到T中任何顶点的最短路径长度 (2)每个顶点对应一个距离值 S中顶点:从V0到此顶点的最短路径长度 T中顶点:从V0到此顶点的只包括S中顶点作中间 顶点的最短路径长度,依据:可以证明V0到T中顶点Vk的最短路径,或是从V0到Vk的 直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和(反证法可证),求最短路径的迪杰斯特拉算法:,一般情况下,Distk = 或者 = + ,设置辅助数组Dist,其中每个分量Distk 表示 当前所求得的从源点到其余各顶点 k 的最短路径。,1)在所有从源点出发的弧中选取一条权值最小的弧,即为第一条最短路径。,2)修改其它各顶点的Distk值。假设求得最短路径的顶点为u,若 Distu+G.arcsukDistk则将 Distk 改为 Distu+G.arcsuk,V0和k之间存在弧,V0和k之间不存在弧,其中的最小值即为最短路径的长度。,求最短路径步骤 引入一个辅助向量D,它的每个分量Di表示当前所找到的从V0到每个顶点的最短路径的长度,初使时令 S=V0,T=其余顶点,Di 为:若存在,为弧上的权值若不存在,为从Di中选取一个其距离值为最小的顶点W,加入S对T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值比不加W的路径要短,则修改此距离值重复上述步骤,直到S中包含所有顶点,即S=V为止,1383032V2:8,13-133032V1:13,-13302220V3:13,-192220V4:19,-2120V6:20,Dijkstra算法的迭代过程,算法实现图用带权邻接矩阵存储ad数组D存放当前找到的从源点V0到每个终点的最短路径长度,其初态为图中直接路径权值数组pre表示从V0到各终点的最短路径上,此顶点的前一顶点的序号;若从V0到某终点无路径,则用0作为其前一顶点的序号,算法描述,1,13,3,1,22,20,2,2,19,4,1,21,5,1,1,1,13,8,13,19,21,20,算法分析:T(n)=O(n),void ShortestPath_DIJ(MGraph G,int v0,PathMatrix / 初始化,v0顶点属于S集,/- 开始主循环,每次求得v0到某个v顶点的最短路径,并加v到S集 - for (i=1; iG.vexnum; +i) / 其余G.vexnum-1个顶点 min = INFINITY; / 当前所知离v0顶点的最近距离 for (w=0; wG.vexnum; +w) if (!finalw) / w顶点在V-S中 if (Dwmin) v = w; min = Dw; / w顶点离v0顶点更近 finalv = TRUE; / 离v0顶点最近的v加入S集 for (w=0; wG.vexnum; +w) / 更新当前最短路径及距离 if (!finalw /if /for / ShortestPath_DIJ,算法分析:T(n)=O(n),每一对顶点之间的最短路径,All-pair Shor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 成都至乌鲁木齐市冷链物流运输及仓储合同
- 交通运输服务采购计划合同范本
- 2025年综合类-公卫执业助理医师-执业医师法、母婴保健法、传染病防治法历年真题摘选带答案(5卷单选100题合辑)
- 2025年综合类-保险经纪人考试-第六章工程保险实务历年真题摘选带答案(5套单选100题合辑)
- 2025年综合类-临床执业医师实践技能-简易呼吸器的使用历年真题摘选带答案(5卷单选100题合辑)
- 2025年综合类-临床医学检验临床血液-多发性骨髓瘤历年真题摘选带答案(5卷单选题百道集合)
- 2025年综合类-中级系统集成项目管理工程师-系统集成项目管理应用技术历年真题摘选带答案(5套单选100题合辑)
- 2025年综合类-中级农业经济-第四章农产品质量与食物安全历年真题摘选带答案(5卷单选100题合辑)
- 山东高速人员管理办法
- 2025年综合类-中医临床三基(医院管理)-医院文化建设历年真题摘选带答案(5卷单选题百道集合)
- 六年级语文毕业总复习教案
- 江苏省苏州市苏州地区学校2024届七年级英语第二学期期末统考试题含答案
- 电商客服周工作计划
- 新青岛版六三制五年级上册科学全册知识点
- DL∕T 1563-2016 中压配电网可靠性评估导则
- Vericut培训教程(可修改)
- 校级课题结题报告会方案
- 高三英语一轮复习人教版(2019)必修第一至三册一词多义和熟词生义清单
- 《电力建设土建工程施工技术检验规范》
- 四年级【语文(统编版)】牛和鹅(第一课时)课件
- DL-T 2589-2023 垃圾发电厂智能点巡检系统技术规范
评论
0/150
提交评论