几种基本算法在树形结构上的应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
在实际实现的时候,并不需要先求出一个BFS 序列,只需要一边DFS一边计算就可以了。 这种方法的时间复杂度和空间复杂度均为 O(N),是理想的线性算法,可以轻松通过所 有的测试数据。
例题1小结 例题 小结
树形结构的特点
procedure dfs(x,time) begin 时间戳=time; 对于x的每个孩子y, dfs(y,time+1) end;
由此我们可以看出,对于一棵树进行深度优先 遍历后,每个节点的孩子节点的时间戳都是小 于当前节点的,在后面的题目中,我们会对于 这一性质进行一些应用。
树形结构的特点
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
建立了数学Hale Waihona Puke Baidu型后,我们就要开始思考这个题 的算法了。 最为直观的方法是:枚举所有的点对,然后计 算它们之间的通路的距离,然后求一个最大的。 这种算法十分直观简单,但是时间复杂度很大。 枚举点对的时间复杂度是O(N^2),而就算利 用了树的特性,通过LCA来计算这两点间的距 离,也还需要O(N)的时间,因此总的时间复 杂度是O(N^3),对于N=100000的时候,会严 重超时。
本题通过一步一步的分析,在最初算法经过优 化仍然无法破解该题的时候,及时地转换了思 路,充分利用了树的性质,并合理地把动态规 划算法在树形结构上进行了应用,最终达到了 理想的线性算法。本题的分析较为详细,为的 是让大家对于如何把动态规划算法在树上进行 使用有一个详细的了解,并能清楚其中的每一 步的过程。希望这一题的分析能让大家对于如 何在树形结构上进行动态规划能有一定的了解。 下面我们再列举一题进行分析:
例题2: 例题 :The Number of the Same BST (POJ Monthly数据加强版 数据加强版) 数据加强版
例题2: 例题 :The Number of the Same BST (POJ Monthly数据加强版 数据加强版) 数据加强版
树形结构的特点
在一棵树里,除了根节点以外的所有节点有且 只有一个父亲节点,根节点没有父亲节点。除 了叶子节点外,所有的节点有一个或多个孩子 节点,叶子节点没有孩子节点。 一棵树里任意两个节点之间都有且只有一条通 路,如果把任意一节点与其相邻节点之间的通 路看作一条无向边的话,那么一棵树里没有环 及重边的存在。因此,一棵有N个节点的树恰 好有N-1条边。
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
因此,我们必须改变我们的思路,采取另一种 方法来计算我们需要的值。 由于这是一棵树,因此我们需要充分挖掘树的 性质。 这是一棵无根树,因此我们不妨设节点1为这 棵树的根节点,通过一次DFS,我们就可以得 到一棵有根树了,每个点也有了其唯一的父亲 节点(根节点除外)。
树形结构的特点
树是具有递归结构的。一个节点即是一棵树, 而一棵有孩子节点的树,若其根节点为a节点, 则其任意一个孩子节点b,与所有不用通过a节 点即可和b相连的节点也构成一棵树,称为以b 为根的a的一棵子树。b的任意一棵子树也是a 的一棵子树。 如果一棵树是有根的,那么某个节点a的深度 d(a)=d(father(a))+1,其中father(a)为a的父亲 节点。特别的,d(root)=1。
动态规划在树形结构上的应用
使用动态规划算法时,必须满足以下几个条件: 整个问题的求解可以划分为若干个阶段的一系 列决策过程。 每个阶段有若干可能状态。 一个决策将你从一个阶段的一种状态带到下一 个阶段的某种状态。 在任一个阶段,最佳的决策序列和该阶段以后 的决策无关。 各阶段状态之间的转换有明确定义的费用。
树形结构的特点
以上即为一些树形结构所具有的特点,在本文 的例题中,对于以上几条性质将会有所应用, 到时将不再具体阐述。
树形结构的特点
对于一棵树,对于它的遍历一般有两种途径。 第一种是深度优先遍历,第二种是宽度优先遍 历,这两种遍历方法对于一棵树进行遍历后, 会得到不同的遍历顺序。在一般的使用中,这 两种遍历都是十分有用的。对于深度优先遍历, 我们可以写出如下的伪代码:
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
这种方法已经比上面一种好了很多,但是对于 N=100000的数据范围,仍然显得太慢。 但是对于要把每一对的点对之间距离都算出来, 光是情况数就是O(N^2)种,即使利用O(1)的 时间复杂度计算出任意两点间的距离,也不能 胜任N=100000的数据范围,这种思路到这里 似乎卡壳了,没有进展的余地了。
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
现在对于任意以a为根的子树,我们来试图求 出在这个子树中的相距最远的两个点的距离, 不妨设其为f[a]。 如果a不是叶子节点,那我们可以得到如下结 论:达到最大值的两个点x和y,只有3种情况:
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
而对于宽度优先遍历,我们可以写出如下的伪 代码:
procedure bfs(front); begin if 队列为空 then exit; 时间戳=front; 对于队首(queue[front])节点x的每个孩子y 把y加入队列 bfs(front+1); end;
树形结构的特点
由此可以看出,对于一棵树进行宽度优先遍历 后,每个节点的孩子节点的时间戳都是小于当 前节点的,而且满足深度越小的节点,它的时 间戳越小。在后面的题目中,我们也会对这一 性质进行一些应用。
这样,我们就可以想到一个基于对以上3种情况讨论 的算法:对于一棵树,我们先对其进行一次宽度优先 遍历,然后按照时间戳,也就是在队列中的位置,从 后往前扫描,扫到某个点a的时候,可以保证a的孩子 节点已经被扫描到并进行过处理了。我们对于每个点 记录两个值:一个f值,一个max值。max[a]代表的是 以a为根的子树中,离a最远的节点到a的距离。这样, 每次只要计算当前节点的f值和max值就可以了。其中 对于某个节点的max[a]=max{max[b]+g[a,b],b是a的 孩子节点},g[a,b]是a与b之间的距离,而f[a]= max{f[b], max[a], max[a]+第二大的{max[b]+g[a,b]}}。 通过这个公式,就可以求出需要的解了,最终的解就 是f[1]。
到了这里,我们忽然发现一个很重要的内容: 这里的方法似乎是递归的! 对于f[a]的计算,只需要a的孩子节点的f值以 及在a的子树中的距a的最远的2个点的辅助计 算,而且与其它的值毫无关系。 到这里,我们发现,这是完完全全的动态规划 的思想,这里一个节点f值的计算只和其孩子 节点的状态有关!
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
引言
众所周知,树形结构是在信息学竞赛中经常出 现的一类结构模型,各类有关树形结构的题目 也是屡见不鲜 。 纯粹的树形结构题,因为树形模型较为单一, 而没有比较大的难度。 因此,我们经常看到的是在树形结构上,运用 一些基本算法解决难度更大的问题。 本文将对此进行一些探索。
树形结构的特点
由于这里主要研究的是树形结构的特点,因此 在这里,树的定义和一些基本概念就不赘述了。 下面主要阐述一些树形结构的主要特点。
几种基本算法在树形结构上的应用
南京外国语学校 欧阳云
摘要
树形结构是信息学中重要的结构模型之一,有 关树形结构的试题在竞赛中也经常出现。鉴于 在树形结构上使用动态规划算法已成为近年来 信息学竞赛的考察热点,本文将重点围绕动态 规划算法在树形结构上的应用,分三个部分进 行阐述,首先对树形结构的特点进行简要介绍, 然后对几种基本算法在树形结构上的应用举例 说明,最后进行总结。
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
如果我们改变思路,减少一些上一种算法的冗 余,采用枚举一个点的方法,时间复杂度可以 下降一维。方法是枚举某个点x后,对这个图, 以这个点为起点进行一次宽度优先搜索。由于 任意两点间只有一条通路,那么通过宽度优先 搜索找到的某点y的距离,就是x到y的距离。 由于枚举点的时间复杂度是O(N),而每次宽 度优先搜索的时间复杂度也是O(N),所以总 的时间复杂度就是O(N^2)。
x或y是节点a,另一个是深度大于节点a的某个 节点,且这个节点在以a为根的子树中; x和y在a的两个不同的孩子节点中; x和y在a的某个相同孩子节点中。 对于这3种情况,我们来计算一下分别满足这 三种情况的相距最远的点对的距离。
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
括号里的信息往往是很重要的,常常能决定这 个题的难度大小和解题思路。我们注意到这题 括号里的信息是:任意两点之间有且只有一条 道路互相到达,这首先说明了,这个图是连通 的,其次,我们发现,这个条件让这个图满足 了树的性质。因此,这些农场和其之间的道路 构成一棵树!因此,题目的要求就变成了:已 知一棵树,任意相邻节点间的边有一定的距离, 要求这棵树上,相距距离最大的两点。
几种基本算法在树形结构上的应用
下面,我便向大家介绍几种基本算法在树形结 构上的应用。
动态规划在树形结构上的应用
近几年的信息学竞赛中,在树形结构上使用动 态规划的题目屡见不鲜,而且有延续之趋势。 由于对简单的动态规划研究的人越来越多,所 以在树形结构上的动态规划题越来越多。这种 动态规划题具有数据量大,编写起来比较复杂 的特点,尤其是题目变化的余地很大,往往会 让参赛的选手措手不及。为了有效解决这一问 题,我们必须紧紧抓住这种动态规划的显著特 点,如利用树形结构中,没有环存在,每个点 只有一个父亲节点等特点,设计高效、正确的 算法。
对于情况1,我们先把a作为节点x,在a的所 有孩子节点中,找出与a相距最远的一个即可。 对于情况2,只要找出和a相距最远的,且在a 的不同的两个孩子节点里的2个节点即可。 对于情况3,它即为max{f[b]}(b取遍a的所 有孩子节点)。
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
例题2: 例题 :The Number of the Same BST (POJ Monthly数据加强版 数据加强版) 数据加强版
很多人都知道二叉排序树这种数据结构。其中 二叉排序树的关键字总是被按以下的方法存储 从而满足二叉排序树的要求: 假定x是一棵二叉排序树中的一个节点,且y是 x的左子树的一个节点,则满足key[y]<=key[x]。 如果y是x的右子树的一个节点,则满足 key[y]>key[x]。 举个例子来看:
动态规划在树形结构上的应用
而在树形结构上使用动态规划时,自然也必须 满足以上的几个条件。但具体怎么才能让动态 规划在树形结构下有用武之地呢?下面便举几 个例子来做简单的说明:
例题1: 例题 :Cow Marathon (USACO FEB04 数据加强版) 数据加强版
在听说了传染病在美国的快速传播后,FJ希望他的奶 牛们能得到更多的锻炼,因此他决定创建一个马拉松 比赛来让他的奶牛们锻炼身体。FJ的地图中有很多的 农场,农场之间有一些路连接它们。这次的马拉松行 程将会包含一对农场以及这两个农场之间的所有道路。 由于FJ希望他的奶牛们能得到尽可能多的锻炼,所以 他希望找到两个在地图上相隔最远的农场作为马拉松 行程中的那一对农场。现在他希望你能帮助他找到这 个最远的距离的大小。(这里要注意的是,FJ的地图 是很特殊的,在这个图上,任意两点间有且只有一条 通路可以互相到达) 数据范围: N为农场数,1<=N<=100000