《图基本算法》PPT课件_第1页
《图基本算法》PPT课件_第2页
《图基本算法》PPT课件_第3页
《图基本算法》PPT课件_第4页
《图基本算法》PPT课件_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、图的根本算法图的根本算法 目录目录1.图的根本概念2.最小生成树算法3.最短路问题4.拓扑排序5.浅析SPFA的优化 栈6.时间允许的情况下,讲tarjan算法 图的根本概念图的根本概念图:二元组 称为图(graph)。 V为结点(node)点(vertex)集。 E为图中结点之间的边的集合。简单图环:端点重合为一点的边。重边:两条边衔接同一对顶点。简单图:没有环和重边的图。无向图和有向图假设边都是双向的,那么这个图叫做无向图。假设边都是单向的,那么这个图叫做有向图。图的根本概念图的根本概念子图:连通性无向图中,假设两个顶点之间存在一条路经,就称这两个顶点是连通的。有向图中,假设两个顶点之间相

2、互都存在一条路,那么称它们是强连通的。假设一个图的恣意两个顶点都是连通的,就称这个图是连通的。顶点的度无向图中,一个顶点相连的边数称为该顶点的度。有向图中,从一个顶点出发的边数称为该顶点得出度;到达该顶点的边数称为它的入度。顶点的最大度数称为图的度数。路和回路一个衔接两个顶点的,顶点与边交替的序列称为路。除了起始与终止顶点,其他顶点都不一样,这样的路称为简单途径。起始与终止顶点一样的简单途径称为圈。EEEVG),(图的根本概念图的根本概念 完全图、稠密图和稀疏图任何两个顶点之间都有边弧相连称为完全图边弧很少的图称为稀疏图反之为稠密图图的表示方法图的表示方法邻接矩阵邻接表邻接矩阵邻接矩阵。,或特

3、殊值;,或权EvvEvvjiAjiji),()(0),()(1,邻接表邻接表邻接表表示法常用于稀疏图需求记录的信息:结点首指针,边的权值和下一条边的指针邻接表的实现邻接表的实现 Struct Edgeint vertex;/记录结点编号int val;/边的权值Edge* next;/记录链表的下一个元素;Edge *edge=new Edgen;for(int i=0;iuvw)/ (u,v)表示一条边,w表示权值L=new Edge;L-vertex=v; L-val=w;L-next=edgeu;edgeu=L;/将(u,v)插入到以u起点的链表中 遍历与u相邻的节点: L=edgeu;

4、 while(L!=NULL).L=L-next;最小生成树问题最小生成树问题生成树:由G的n-1条边构成的无环的子图,这些边的集合成为生成树。最小生成树:一切生成树中权值最小的一个边集T为最小生成树,确定树T的问题成为最小生成树问题。prim算法kruskal算法prim算法的根本思想算法的根本思想任取一个顶点参与生成树;在那些一个端点在生成树里,另一个端点不在生成树里的边中,取权最小的边,将它和另一个端点加进生成树。反复上一步骤,直到一切的顶点都进入了生成树为止。int prim(int s)/s为初始参与的点int i,j,sum=0;for(i=1;i=n;i+)closesti=10

5、000000;for(i=1;i=n;i+)closesti=mapsi; closests=0;int now;for(i=1;in;i+)int min=INT_MAX;for(j=1;j=n;j+)if(closestj&closestjmin)min=closestj;now=j;sum+=min;closestnow=0;for(j=1;j=n;j+)if(mapnowj&mapnowj ranky2 then py x3 else px y4 if rankx = ranky5 then ranky ranky + 1The FIND-SET procedure w

6、ith path compression is quite simple.FIND-SET(x)1 if x px2 then px FIND-SET(px)3 return pxMST-KRUSKAL(G,w)1. A2. for 每个结点vVG3. do MAKE-SET(v)4. 根据权w的非递减顺序对E的边进展排序5. for 每条边(u,v)E,按权的非递减次序6. do if FIND-SET(u)FIND-SET(v)7. then AA(u,v)8. UNION(u,v)9. return A复杂度E*logE例题例题 POJ3522标题大意:给出一个由n个点m条边构成的无向图

7、,找出一棵生成树,使得这个生成树上的最大边与最小边权值之差最小思绪:思绪:用Kruskal!由于kruskal算法是将边排序后从最小权值边开场不断地参与不构成环的边,我们可以由小到大枚举每次构成的生成树中的最小边来求的假设干棵生成树。每次更新一下差值。求得最优解。练习练习 Prim POJ 1258 POJ 2485 Kruskal POJ1861最短路问题最短路问题单源最短途径bellman-ford算法 spfa算法 dijkstra算法每对顶点的最短途径 floyd-washall算法 单源最短途径单源最短途径知图G=(V,E),我们希望找出从某给定源顶点sV到每个顶点vV的最短途径。在

8、单源最短途径问题的某些实例中,能够存在着权值为负的边,假设图不包含从s可达的负权回路,那么对一切的vV,最短途径的权的定义依然正确。假设存在一条从s可达的负权回路,那么最短途径的定义就不成立了。易知,一条最短途径不能包含回路。松弛技术松弛技术bellman-ford,spfa,dijkstra算法都运用了松弛技术,对每个顶点vV,都设置一个属性dv,用来描画从源点s到v的最短途径上权值的上界。伪代码: 初始化: Init(G,s) for each vertex vVG do dv=; ds=0; 松弛:Relax(u,v,w) if(dvdu+w(u,v) dv=du+w(u,v)Bellm

9、an-Ford算法算法Bellman-Ford(G,w,s) Init(G,s) For i 1 to |VG|-1 Do For 每条边(u,v) EG Do Relax(u,v,w) For每条边(u,v) EG Do If dv du + w(u, v) Then Return FALSEReturn TRUE/时间复杂度为O(V*E);Bellman-Ford算法能在普通的情况存在负边权的情况下处理单源最短途径问题,对于给定的带权有向图G=(V,E),其源点为s,对该图运转Bellman-Ford算法后可以前往一个bool值阐明图中能否存在着一个从源点可达的权为负的回路,假设存在这样的

10、回路的话,算法阐明该问题无解,假设不存在这样的回路,算法将产生最短途径及其权值。 对bellman-ford算法的阐明: 假设没有负权回路,运转一次bellmanford算法,将得到源点到恣意点的最短路: 由于源点到恣意一点至多n-1条边,我们经过n-1次循环,每重循环对一切的边进展松弛,能保证每次至少得到一个di,其值为源点到i点的最短路,最终n-1次循环之后就能求得一切的di。 假设包含负权回路,那么n-1次循环之后还会存在点u,v,使得dvdu+wu,v,这样我们就能判别能否存在负权回路。例题:例题:POJ 3259标题大意:农场上有N块田地N = 500,M条途径M = 2500可以从

11、i到达j破费t单位时间。另外还有W个虫洞W = 200,虫洞可以从一块地i到达另一块地j并且时间倒退t!留意途径是双向的,虫洞是单向的。如今农夫John希望知道能否从某块地出发并且回到这块地,使得他回来的时间早于出发的时间可以遇到他本人。2 /农场个数 (text cases)3 3 1 /田地 途径 虫洞 他们的个数1 2 2 /田地途径 u, v, 以及经过需求的时间1 3 42 3 13 1 3 /虫洞途径 u, v, 以及倒流的时间3 2 11 2 32 3 43 1 8标题分析:此题题意是判别有向图中能否存在负权回路,怎样构造图呢?对于双向途径(u,v),可以构呵斥两条边(u,v,t

12、)和(v,u,t),对于虫洞单向途径(u,v),可以构造一条边(u,v,-t),这样运转bellman-ford算法就可以判别出能否存在负权回路。代码附后Dijkstra算法算法Dijkstra算法处理了有向图G=(V,E)上带权的单源最短途径问题,但要求一切边的权值非负。Djikstra算法中设置了一顶点集合S,从源点s到集合中的顶点的最终最短途径的权值均已确定,算法反复选择具有最短途径估计的顶点uV-S,并将u参与S中,对u的一切出边进展松弛。算法执行过程算法执行过程int dijkstra(int s,int n)int i,j;int vMAX;int dMAX;for(i=1;i=n

13、;i+)di=map1i;v1=1;for(i=1;in;i+)int now,min=INT_MAX;for(j=1;jdj)min=dj;now=j;vnow=1;for(j=1;j=n;j+) /松弛if(!vj&dnow+mapnowjd(u)+w(u,v)那么改良 ,pre(v)=u,由于d(v)减少了,v能够在以后改良其他的点,所以假设v不在Q中,那么将v入队。3.不断迭代2,直到队列Q为空(正常终了),或有的点的入队次数=n含有负圈。普通用于找负圈(效率高于Bellman-Ford),稀疏图的最短路由于点能够多次入队,但队列中同时不会超越n个点。所以用一个长度为n的循环队

14、列来实现这个队。SPFA在方式上和宽度优先搜索非常类似,不同的是宽度优先搜索中一个点出了队列就不能够重新进入队列,但是SPFA中一个点能够在出队列之后再次被放入队列,也就是一个点改良过其它的点之后,过了一段时间能够本身被改良,于是再次用来改良其它的点,这样反复迭代下去。设一个点用来作为迭代点对其它点进展改良的平均次数为k,有方法证明对于通常的不含负圈,较稀疏情况,k在2左右。算法复杂度实际上同Bellman-Ford,O(nm),但实践上却是O(km)。例题:看晴子大牛的体型知道他一定又馋又懒,他有n-1个小弟,每天都让他的n-1个小弟去n-1个不同的饭馆给他买回山珍海味,知饭馆之间是以有向图

15、衔接起来的,我们可以保证每两个饭馆之间可以相互可达,问他的小弟帮他买回饭来总共走的最短路程是多少假设晴子大牛所在顶点为点1,饭馆为2n?n=m=1000000由于数据范围很大,Dijkstra算法和Bellman-Ford超时,我们可以用spfa算法求得由点1到其他点的间隔,那么怎样求从其他点到点1的间隔呢?我们可以把每条有向边反向,这样再用spfa在反向的图中求一次源点到其他的点的间隔就求出了从每个点到源点的间隔。代码附后单源最短路问题小结单源最短路问题小结Dijkstra算法的效率高,但是也有局限性,就是对于含负权的图无能为力。Bellman-Ford算法对于一切最短路长存在的图都适用,但

16、是效率经常不尽人意。SPFA算法可以说是综合了上述两者的优点。它的效率同样很不错,而且对于最短路长存在的图都适用,无论能否存在负权。它的编程复杂度也很低,是性价比极高的算法。对于绝大多数最短路问题,我们只需套用经典算法就行了。所以往往我们的难点是在模型的建立上。每对顶点的最短途径每对顶点的最短途径floyd-washall算法的根本思想算法的根本思想递推产生矩阵序列f(0), f(1), , f(n)。其中f(0)i,j=mapi,jf(k)i,j的值表示从vi到vj,中间结点编号不超越k的最短途径长度。f(n)i,j的值就是从vi到vj的最短途径长度。递推过程递推过程-动态规划动态规划假设f

17、(k)i,j中间节点编号经过k,那么f(k)i,j=f(k-1)i,k+f(k-1)k,j。假设f(k)i,j中间节点不经过k,那么f(k)i,j=f(k-1)i,j假设f(k-1)i,jf(k-1)i,k+f(k-1)k,j ,那么就令f(k)i,j= f(k-1)i,k+f(k-1)k,j实现:for(k=1;k=n;k+) for(i=1;i=n;i+) for(j=1;jF(u)+W_Cost(u,v) thenF(v)=F(u)+W_Cost (u,v);SPFA的中心正是松弛操作:.A1TAnS但松弛操作直接得出的Bellman-Ford算法效率低下 For Time=1 to N

18、 For (u,v)ERelax(u,v)上图数据中,总运算量高达N2而边(S, A1)虽然被调用N次。但实践有用的只需一次SPFA那么运用队列进展了优化!思想: 只保管被更新但未扩展的节点。 减少了大量无用的计算,效率大大提高!A1A2.A4An-1A3AnHeadTail当前待扩展元素在上图的例子中,每个节点只进队一次,只需N次运算。相比Bellman-Ford优势明显。.A1TAnS但有负环时依然退化为O(NM)在1000000个点,2000000条边的随机数据中SPFA甚至比运用堆优化的Dijkstra还要快。A1TAnS.长期以来基于队列的SPFA并未获得突破传统的队列实现:缺陷:NewNode需求之前的元素全部出队后才干扩展 中断了迭代的延续性A1A2.A4An-1A3AnHeadTailNew Node猜测:猜测: 能否把能否把NewNode放在放在Head后面进展下一次扩展?后面进展下一次扩展?猜测程序图论中的根本算法 :深

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论