国家集训队2009论文集分治算法在树的路径问
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分治算法在树的路径问题中的应用
【摘要】
树作为一类特殊的数据结构,在信息学中有着极为重要的作用,各类关于树的题目在竞赛中更是屡见不鲜。本文选取了近几年出现的关于树的路径的题目,并结合例题讲解了分治算法在此类问题上的应用。
【关键字】
树路径路径剖分分治数据结构
【目录】
【序言】 (3)
【正文】 (4)
一.树的分治算法 (4)
基于点的分治: (4)
基于边的分治: (4)
效率分析: (5)
【例1】树中点对统计 (8)
算法分析 (8)
【例2】Free Tour 2 (10)
算法分析 (10)
【本节小结】 (13)
二.树的路径剖分算法: (14)
【例3】Query On a Tree (14)
算法分析 (14)
引入路径剖分 (14)
轻重边路径剖分 (15)
【例4】黑白树 (17)
算法分析 (17)
【小结】 (18)
路径剖分与树的分治的联系: (19)
【例5】Query On a Tree Ⅳ (20)
算法分析 (20)
【本节小结】 (23)
三.树的分治的进一步探讨: (24)
如何改进基于边的分治的时间复杂度 (24)
使用基于边的分治解决【例2】 (26)
使用基于边的分治解决【例5】 (27)
四.全文总结 (28)
【参考文献】 (29)
【感谢】 (29)
【附录】 (29)
树被定义为没有圈的连通图,具有以下几个性质:
1.在树中去掉一条边后所得的图是不连通的。
2.在树中添加一条边后所得的图一定存在圈。
3.树的每一对顶点U和V之间有且仅有一条路径。
由于树具有一般图所没有的特点,因此在竞赛中有着更加广泛的应用,尤其是关于树中路径的问题,即一类以路径为询问对象的题目,更是频繁的出现在各种比赛中,每一个有志于OI及ACM的选手都应该掌握这类问题的算法。
分治,指的是分而治之,即将一个问题分割成一些规模较小的相互独立的子问题,以便各个击破。我们常见的是在一个线性结构上进行分治,而在本文中我们将会讲解分治算法在树结构上的运用,称之为树的分治算法。
分治往往与高效联系在一起,而树的分治正是一种用来解决树的路径问题的高效算法。
下面让我们一起来感受树的分治算法的美妙吧。
一.树的分治算法
下面给出树的分治算法的两个常见形式:
基于点的分治:
首先选取一个点将无根树转为有根树,再递归处理每一颗以根结点的儿子为根的子树。
基于边的分治:
在树中选取一条边,将原树分成两棵不相交的树,递归处理。
效率分析:
首先我们考虑如何选取点(边)。对于基于点的分治,我们选取一个点,要求将其删去后,结点最多的树的结点个数最小,这个点被称为“树的重心”。而基于边的分治,我们选取的边要满足所分离出来的两棵子树的结点个数尽量平均,这条边称为“中心边1”。而对于这两个问题,都可以使用在树上的动态规划来解决,时间复杂度均为)(N O ,其中N 为树的结点总数。
对于树的分治算法来说,递归的深度往往决定着算法效率的高低,下面我们来分析上述两种方式的最坏递归深度。
定理1:存在一个点使得分出的子树的结点个数均不大于2/N
证明:
假设U 是树的重心,它与Vk V V 2,1相邻,记)(X Size 表示以X 为根的子树的结点个数。记V 为Vk V 1中Size 值最大的点。
我们采取反证法,即假设2/)(N V Size >,那么我们考虑如果选取V 作为根结点的情况,记)('X Size 表示此时以X 为根的子树的结点个数。
如下图,对于A 部分,显然)()('V Size Ti Size <,对于B 部分,Size(V)N/2 Size(V)-N (U)Size'<<=,这与我们假设矛盾。
定理得证。
1 由于作者没有在有关文献中发现这条边的名称,暂且称之为中心边
由定理1可得,在基于点的分治中每次我们都会将树的结点个数减少一半,因此递归深度最坏是)(log N O 的,在树是一条链的时候达到上界。
定理2:如果一棵树中每个点的度均不大于D ,那么存在一条边使得分出的两棵子树的结点个数在)]1/(*),1/([++D D N D N 。)2(>=N
证明:
不妨令D 为所有点的度的最大值。
当1=D 时,命题显然。
当1>D 时,我们设最优方案为边V U -,且以V U ,为根的两棵子树的结点个数分别为S 和S N -,不妨设S N S ->=。
设X 为U 的儿子中以X 为根的子树的结点个数最大的一个,我们考虑另一种方案U X -,设除去边U X -后以X 为根的子树结点个数为P 。显然)1/()1(-->=D S P ,由于S P <且边V U -是最优方案,所以S P N >=-,与)1/()1(-->=D S P 联立可得D N D S /)1)1((+-<=,又1+>=D N ,所以)1/(*+<=D D N S 。
证毕。
由定理2我们可以得到在D 为常数时,基于边的分治递归最坏深度为)(log N O 。
但是在一般的题目中,D 可能较大甚至达到)(N O ,这时这个算法的效率十分低,因此在本节中我们只考虑使用基于点的分治。
【例1】树中点对统计2
给定一棵)100001(<=<=N N 个结点的带权树,定义),(v u dist 为v u ,两点间的最短路径长度,路径的长度定义为路径上所有边的权和。
再给定一个)101(9<=<=K K ,如果对于不同的两个结点b a ,,如果满
足K b a dist <=),(,则称),(b a 为合法点对。
求合法点对个数。
算法分析
如果使用普通的DFS 遍历,时间复杂度高达)(2N O ,而使用时
间复杂度为)(NK O 的动态规划,更是无法在规定时限内出解的。
我们知道一条路径要么过根结点,要么在一棵子树中,这启发了我们可以使用分治算法。
路径在子树中的情况只需递归处理即可,下面我们来分析如何处理路径过根结点的情况。
2 Poj1741, LTC_Man_Contest E.Tree