ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:77.57KB ,
资源ID:366167      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/366167.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(dfnlow算法要点.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

dfnlow算法要点.docx

1、dfnlow算法要点总结DFN-LOW算法在图论中的应用北京大学 许若辰 长沙市雅礼中学 屈运华摘要: 在一个连通图1G中,有些点一旦被去除就会导致图不连通,同样的,有些边一旦被去除也会导致图G失去连通性,那么如何求出这些点和边就是一个需要被解决的问题。为此,有一种算法通过标记每个点按照遍历顺序得到的序号和查看该点通过边可以到达的点的最小序号来进行判定,解决了这个问题。此算法简单而容易理解,简称为DFN-LOW算法。关键字:有向图 无向图 强连通分量 桥 割顶一、 引言有关图论的几个问题,如求无向图2的桥3、求无向图的割顶4、求有向图5的强连通分量6等,都能够被几种不同的算法解决。其中有一种算

2、法,找到了这几个问题的共性,通过记录每个点的DFN值和LOW值,用大同小异的判定方式简洁的解决了这几个问题,思路巧妙具有针对性,把握住了问题的关键,值得借鉴。本篇论文将回顾DFN-LOW算法在图论中的应用及解决相关问题时的思路。二、 通过无向图桥的性质引出DFN-LOW算法对图进行遍历的方式要了解图的一些性质,必然要对图进行遍历。对图进行遍历的方式主要有两种,一种是宽度优先,一种是深度优先。它们的本质区别在于宽度优先是按照每个点到源点的距离,一层一层的整体进行遍历。对于每层点,每次将和它们相连且尚未被遍历的点放入下一层。而深度优先则是每次从当前点遍历到一个与它相连且尚未被遍历的点,并由新的被遍

3、历的点继续往下遍历,如果没有则回到上一个点重复上述操作。由此可以看出,宽度优先遍历往往容易得到图的整体性质,深度优先遍历往往容易得到图的局部性质。如右图,根据桥的定义可以知道,虽然去除连通图中被称作桥的边e后会导致原图被分割成两个连通图,整个原图连通性丧失,但其本质只是导致了e的两个端点3、4以及通过3、4而连通的点对间的连通性丧失,即3无法通过除了e以外的边集到达4,这相对而言属于局部性质,所以用深度优先进行图的遍历更加容易分析桥和图的连通性之间的关系。此外,不管是何种遍历,在遍历过程中每个点都可能会被多次访问到,但是由于每个点都只会被遍历一次,所以由图中所有点和遍历边7组成的图G必然是一棵

4、树(以下图中用三角形表示子树),其中遍历边被称作树边(以下图中用实线表示),而原图中的非遍历边被称作非树边(以下图中用虚线表示)。三、 通过求无向图的桥引入DFN-LOW算法要判定某条边是否为桥,还需要对桥的性质进行进一步的挖掘。那么直观的进行分析,如右图。若在深度优先遍历中1号点通过了某条树边e遍历到了2号点,并接着以2号点为根遍历出了一棵子树,设u为子树中任意一点。如果边e是桥,则等价于删除了e之后1号点和2号点会不连通,即2号点无法通过u访问到1号点或者比1号点更早被遍历到的点。此时,e是否为桥便可以由2号点的性质来进行判定。得到上述结论,便大致了解了DFN-LOW算法判定桥的思想,接下

5、来对算法进行具体讲述。在判定过程中,主要有两个量是判定的关键,因此定义dfn、low两个一维数组。用dfni记录编号为i的点的遍历序号,即第几个被遍历到的,用lowi记录编号为i的点在接下来的遍历中可以访问到的最小序号。那么由分析得知,对于通过树边e遍历出的点u,如果在接下来的遍历中u无法访问到序号比u更小的点,即dfnu等于lowu,那么e就为桥。而根据low值的定义又可以知道u的low值可以由与u有边相连的点的low值计算出来。根据这个思路,便可以写出整个算法的流程,下面以c+代码为例加以说明。/edge_numi表示从i号点出发的边有多少条/edge_lableui 由u出去的第i条边的

6、 下标/edgeui表示由u点为起点的第i条边的终点 编号。void bridge(long u,long e) /通过树边e遍历到了当前点u long i,v; tot+;/累加遍历序号 dfnu=lowu=tot;/初始u点的dfn和low值都为遍历序号 for (i=1;i=edge_numu;i+)/访问每个与u相连的点v if (edge_lableui!=e)/不能直接通过无向边e从u访问回序号小的点,否则算法失去意义 v=edgeui; if (dfnv=0)/如果v尚未被遍历(设序号从1开始标记) bridge(v,edge_lableui);/那么对v进行遍历并传递相应的值

7、if (lowvlowu)/v能访问到的点,u必然也能访问到,所以用lowv更新lowu lowu=lowv; else if (dfnvlowu)/如果v已经被遍历,那么u只能访问到v,用dfnv更新lowu lowu=dfnv; if (lowu=dfnu)/如果遍历完以u为根的子树后lowu仍然等于dfnu则说明e为桥 printf(%ldn,e);/输出e四、 求无向图的割顶通过求无向图的桥,DFN-LOW算法的判定思路已经展示的非常清晰。而同时根据割顶的定义可以发现,桥的两个端点必然是割顶,删除了割顶等价于删除了桥,这说明了割顶和桥在性质上是非常类似的。因此在求无向图的割顶的时候,依

8、旧可以按照求桥时的思路进行判定,但是由于点和边的结构不同,所以一些细节也是必须要考虑的。那么直观的分析一下割顶的特点,如右图。1号点通过树边遍历到了2号点,然后以2号点为根遍历出了一个子树,设u为子树中的任意一点。如果1号点是割顶,则等价于删除了1号点后2号点将与1号点以及比1号点更早被遍历到的点不连通,即2号点无法通过u访问到比1号点序号更小的点。所以便可以得到结论,若v为u的一个儿子8且v的low值不小于u的dfn值,则u为图的割顶。关于这个结论,有三个细节需要注意。第一点,在结论中v的low值等于u的dfn值时结论也成立,这个很显然,看图分析即可得到。第二点,如果u为深度优先遍历的根节点

9、,那么只有当它有至少2个儿子v1、v2同时满足它们的low值不小于u的dfn值时结论才成立。如右图,若v2子树不存在,那么删除u仅仅只是删除了图的一个“端点”,剩下的v1仍然是连通的。所以判定根节点是否为割顶时要特殊考虑。第三点,在第二点中,v1、v2必须是u的儿子,即必须是由u通过树边遍历出的点。如右图,若v2和u有边相连但不是u的儿子,则v2必然在以v1为根的子树中,此时u只是图“边缘”上的一个点,删除u后v1、v2仍然连通,在图的连通性方面v1、v2也是等价的,所以应不对v2进行考虑。根据以上讨论,便可以写出整个算法的流程,下面以c+代码为例加以说明。void cutpoint(long

10、 u, long e) /通过树边e遍历到了当前点u long i,v,sum; tot+;/累加遍历序号 dfnu=lowu=tot;/初始u点的dfn和low值都为遍历序号 sum=0;/初始化满足条件的儿子个数 for (i=1;i=edge_numu;i+)/访问每个与u相连的点v if (edge_lableui!=e)/不能直接通过无向边e从u访问回序号小的点,否则算法失去意义 v=edgeui; if (dfnug1=0)/如果v尚未被遍历(设遍历序号从1开始) cutpoint(v,u);/那么对v进行遍历并传递相应的值 if (lowv=dfnu)/如果儿子v不能访问到比u序

11、号更小的点 sum+;/累加满足条件的儿子个数 else if (dfnv=2)|/如果u不为根且有满足条件的儿子或者 (sum=1)&(u!=root)/u为根且有不少于2个满足条件的儿子则u为割顶 printf(%ldn,u);/输出u五、 求有向图的强连通分量DFN-LOW算法在无向图中的应用是非常简捷的,因为无向图具有非常好的性质,即所有边都是无向边,因此有边相连的点集必然会形成一个连通块9。而有向图则不然,即使一个连通图在边被定向之后也未必强连通,所以对于有向图来说,桥和割顶难以成为重心,相对的,在有向图中才有定义的强连通分量则成为了有向图中的重心。本文讨论的强连通分量均默认为极大强

12、连通分量10。根据强连通分量的定义可以发现,它不同于桥或者割顶只是单个点或者边,而是点和边的集合,这就说明了求强连通分量会更加的复杂和烦琐。但是即便如此,仔细观察可以得知,它和桥或者割顶却有着极其类似的性质,如右图。1号点由树边遍历到了2号点,并以2号点为根遍历出一棵子树。如果这棵子树成为了一个强连通分量,则等价于2号点无法和1号点或者比1号点更早被遍历到的点强连通(否则该强连通分量不极大),即2号点无法通过有向边经过u访问到1号点或者比1号点序号更小的点。这个结论和对桥进行判定时的结论简直如出一辙,因此完全可以用同样的思路来求强连通分量。为了方便,在求强连通分量的过程中只记录每个强连通分量的点,在同一个强连通

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1