【SJTUOJ笔记】P1080 小F的公寓(NOIP2007 树网的核)

本文详细探讨了如何在O(n)的时间复杂度内解决NOIP2007题目P1080小F的公寓问题,涉及树的直径、核的概念及其性质。通过分析树的直径形态,指出所有直径的中点重合于树的中心,从而简化问题。文章介绍了如何确定树的直径以及寻找核的位置,提出动态规划、两次DFS或BFS的方法,并阐述了利用单调队列解决最远旁枝问题,实现整个算法的复杂度为O(n)。
摘要由CSDN通过智能技术生成

https://acm.sjtu.edu.cn/OnlineJudge/problem/1080
这道题对树网的核的数据范围做了改动,增加了 n=500000 n = 500000 的数据,因此必须采用时间复杂度 O(n) O ( n ) 级别的算法。
OJ上给了大段的提示,这里先原文搬过来:

本题是NOIP题目,由于数据范围很小,O(N3)、O(N2)、O(N×S)等复杂度的算法都可以获得满分,但实际上存在更优秀的算法。
题目中要求找的路径必须在树的直径上,如果直接按照描述来,需要找出树的所有直径,而树的直径最多可以是O(N2)级别的,这样做的话最终复杂度必然会很高,所以必须先对此作出简化。
树的直径虽然可能很多,但它们的形态是很有规律的,题目描述中就已经给了我们一个很有用的规律:
所有直径的中点是重合于树的中心。
我们从最简单的情况入手:树有多条直径,长度均为D,所有直径唯一的交集就是树的中心(那么树的中心一定处于一个结点上)。
那么显而易见,树的形态应该是这样的:从树的中心出发有4条以上没有交集的长度为D/2的路径,不妨称它们为半径。
显然无论怎样选择核的位置,它最多只能覆盖到两条半径,那么偏心距不可能小于D/2,而直接选择树的中心作为核,偏心距就已经是D/2了,所以树的中心就是核,而这个核位于所有的直径上。
如果所有直径的交集不是一个点呢?由于直径是树上的连续路径,而两条连续路径的交集如果不是空集,一定也是连续路径。
而题目已经告诉了我们,所有直径必定是有交集的,那么交集不是一个点的话,就必然是一段连续的路径,设这个交集为W。
每一条直径都是W两头再延伸出去一段路径形成的,稍加分析就能证明,对于W的某一头,直径延伸出去的所有路径长度都是相等的,
//===裂掉的图和说明文字===
联系前面讨论的“交集为一个点”的情况,会发现这里情况是类似的,如果核覆盖到了蓝色的边,那么将核在蓝色边上的部分删掉,偏心距是不会变化的,所以核一定是在红色的部分上的,换句话说:核在任意一条直径上,这和前一种情况得出的结论是相同的。
有了这个结论,我们就可以随便找出一条树的直径,再在上面找核了。找树的直径可以使用动态规划算法或者两次dfs的方法,复杂度均为O(N),具体方法不在此文叙述。下面来研究怎样找到核的位置。
一条直径上最多有O(N)个点,那是否有O(N2)种核的选择方案呢?注意到这样一个性质,向一条路径多加入一条边,偏心距是不会变得更大的,所以如果核在直径上的起点确定了,就可以一直沿着直径向下走,直到走到头或者总长度将要超过S为止&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值