CF750F
CF750F New Year and Finding Roots
首先分析,如果询问某个点
- 邻居数为
1 ,则x 为叶子节点,并且我们可以知道它的父亲; - 邻居数为
2 ,则x 为根节点,那么我们已经得到答案,直接结束; - 除次之外,邻居数一定为
3 ,则x 为树中某个普通点。
假设我们现在在点
当
我们先随机取一个点询问,设为
如果开始时
如果开始时
这样我们就能成功找到根了,不过只有这些询问次数会超过
-
对于已经询问过的点,记下信息,以后不再询问它;
-
向几个方向 bfs 时,优先沿着之前询问过的邻居遍历(当然不可以是前驱点),这样能使以前向上方向 bfs 的信息充分利用;
根下第二层 bfs 第一次就能找到根,计算可以知道,最坏情况会询问
于是还需要优化:
- 当深度为
3 时,不需要再做 bfs 到叶子,根就在距离它为2 的四个点之一,于是询问其中三个即可,这里有个小细节,对于四个点中某个没询问过的点,不询问它而是询问其他三个,否则可能出现询问为17 次。
最后画个图理解下过程:(
这里假设