[2018年最新整理]《关键边(KeyEdge)》解题报告.docVIP

[2018年最新整理]《关键边(KeyEdge)》解题报告.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[2018年最新整理]《关键边(KeyEdge)》解题报告

《关键边(Key Edge)》解题报告 安徽 周源 摘要 算法 动态维护树+最近公共祖先查询 时间复杂度 O(NlogN + M + QlogN) 空间复杂度 O(N + M) 问题描述 写一个程序,读入一个无向的连通图的信息,图中两点间可以有多条边,可以有边的两个端点相同。程序需要处理以下两种命令: 删除图中一条边(保证边存在,删除后仍保证图是连通的) 询问图中两个点a和b之间的关键边有多少个(所谓关键边,即若删除了这条边,a和b就无法互相到达) 输入格式: 输入文件第一行有三个整数N, M和Q,分别表示图中顶点个数,边的个数和需要执行的命令个数,图中节点的编号为1…N 接下来M行,每行两个整数描述图中的一条边 接下来Q行,每行描述一条命令: 1 a b:表示删除图中的边(a, b) 2 a b:表示询问图中a到b路径上关键边的数目 输出格式: 对于每一次询问,你的程序都需要向输出文件输出一行:a和b间关键边的数目 数据规模: 1 ≤ N ≤ 3 * 104 1 ≤ M ≤ 105 1 ≤ Q ≤ 105 分析 这是我为今年安徽省省赛出的一道备选试题,;因此在2005年5月26日前保密(。 初步分析 本题的输入涉及到两类操作,一是删除某条边,一是询问关键边数目。 我们先来看一个简单一些的问题:如果没有删边操作,而只是给出一幅图,不停地询问某两点间关键边的数目,该如何设计高效的算法? [定理1]任意两点a和b间的关键边集合,等于a到b任意一条路径与整个图的关键边集合的交集。 [证明]不妨设a和b间关键边的集合为C,整幅图的关键边集合为K,而存在某一条a至b的路径P。 分析任意一条边e ∈ C,由于删去了e,a和b就不连通了,那么显然整个图也就不连通了,因此e ∈ K,而既然e是a到b的关键边,说明从a到b必然经过e,所以有e ∈ P。故: 任意e ∈ C ( e ∈ K∩P 即: C K∩P (1) 而另一方面,对于任何e ∈ K∩P,设e的两个端点为u和v:在路径P上,从a出发,先到达u,然后穿过e,从v到达b。由于e是图中的关键边,删除e以后整幅图会分裂成为两个部分:一部分含有u节点,一部分含有v。若在分裂后的图中a和b仍然连通,可知:a与u存在一条不含e的路径,因此连通,同样b和v连通,故u和v连通,导出矛盾。因而a和b在删除e以后必然不连通,即 任意e ∈ K∩P ( e ∈ C K∩P C (2) 综合(1)式和(2)式,得 C = K∩P 故[定理1]成立。 由[定理1]可知,任意两点间的关键边与整幅图的关键边都有密切的关系。因此不妨先求出图的关键边:根据图论知识可知,一幅图中的关键边连接的都是不同的块,如果将图中的一个个块收缩成节点(或是说看成节点),则任意两个块之间的路径上的边都是关键边,由关键边的性质:任意两个块之间有且仅有一条路径,即收缩后的图是一棵树,不妨称之为关键边树。 根据[定理1],两点间的关键边集合等于两点间任意路径和整幅图关键边集的交。因此不难发现,若找到a和b所属的块A和B,那么在关键边树上A到B的唯一路径上的边都是a到b的关键边,即我们要求的关键边数目就是关键边树上A到B的路径长度:如下图中的红色边所示。 那么目前问题的关键在于如何求树上两点间的距离:不妨任选一个点R作为根,将这棵树变成一棵有根树后,可以确定每一个点的深度:DepthA,DepthB等等。 不难看出A到B的路径一定是从A开始,先向上走到A和B的最近公共祖先: C = LCA(A, B) 接着再从C向下沿着树上边走到B。 那么前一段的路径长度为DepthA – DepthC,而后一段路径长度则为DepthB – DepthC,因此A到B的路径长度则为: DepthA + DepthB – 2 * DepthC 由于询问LCA可以在O(nlogn)的时间内与处理,并做到O(1)的询问。 因此对于这个子问题,我们可以做到O(m + nlogn)的预处理,以及O(1)的询问。其中O(m)的预处理是求出图中的块,构造关键边树。 深入思考 回到原先的问题中,如何让我们的算法支持删除操作呢?由于本题并没有要求我们的算法支持联机操作,因此我们可以设计这样的脱机算法:先将所有的边都删除,然后反向执行所有的操作:遇到询问就打印结果,而遇到删除操作,我们要做的则是向图中加上一条边! 因此现在我们的算法需要支持的操作是插入,而不是删除——看上去这样会简单一些(。 在询问时我们需要知道的两个量:Depth和LCA函数,在每加入一条边的时候,我们就需要维护手中的关键边树,以及与树有关的这两个量。 如上图所示,假设在图中插入了一条边e(a, b),我们首先找到a和b分别所在的块A和B。那么实际上即可以理解为在手头的关

文档评论(0)

liwenhua11 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档