2025.2.13 闲话:一道题中得到的诸多解题思想

P1399 \[NOI2013\] 快餐店,一道 神经题目 好题,卡我半天(非虚指),从题目结论推导到代码实现精准打中我的盲点,我觉得它应该升紫。

首先读题,简化题意为:在基环树上找一个点使得这个点到其它每个点最短路的最大值最小。

初读貌似是二分答案,实际上也确实可以二分答案,但是我是来这里练基环树 DP 的。

然后我当然不会推结论 不然这道题就不会出现在这里了,大多题解中的结论“基环树直径的一半”又是错误的,但是总有人不随波逐流,终于让我找到了一篇正确的题解:

我们做出答案点的最短路生成树,发现答案点也是该生成树上到其它点距离的最大值最小的点(对于该生成树的答案),于是可以考虑枚举生成树并求生成树的答案。接着又发现枚举生成树求出的答案值不会小于原图的答案值,于是算法正确性成立。

这段话说的不算详细,我们来一句一句拆解分析。

我们做出答案点的最短路生成树

这第一步我就没有想到。首先来考虑这个想法是从哪里来的:做一道题需要性质,而这道题就需要考虑答案点具有哪些性质

在一个基环树上,从一个点到另一个点有一到两条路径,而只有短的那一条是有用的,无用的较长路径可以忽略不计。

假设已经确定了答案点,那么答案点要走到一棵子树内任意点所经过的环上路径(假设经过了环)都应该是一模一样的。

如果只考虑环上的情况,那么所有的子树都可以忽略不计,我们只考虑答案点到环上每一个点的最短路径该向那边走。用一用小学几何知识,把环想象成一个圆圈,那么与答案正对的一个点就是分界点。终点在左侧的所有路径都应该在左侧,终点在右侧的所有路径都应该在右侧。

然后就会发现,正对面那个点所处的边永远不会被整个跨过,也就永远不会作为较短边被走到,这条边可以直接忽略

那么少了一条边,这个基环树也就变成了一个标准的树。而树上找这个答案点很简单,就是直径中点。

上述思考过程就可以浓缩成题解里的一句话,不过实际思考时更有可能是先想到在一棵普通树上这个问题很好做,进而想着怎么把基环树删去环上一条边,从而才想到忽略子树,先确定答案点,然后朦胧中感觉有一条边永远不会被走到,这才进行证明。

于是可以考虑枚举生成树并求生成树的答案

这里大概是用到了动态思想,想象答案点移动的时候会发生什么。显然,最短距离生成树也会发生变化且一个答案点对应一个生成树。

根据之前得到的附加结论,知道生成树以后可以反推答案点,也就是说一个生成树对应一个答案点。答案点和生成树一一对应,利用转换思想,将看不见摸不着的枚举答案点转换成枚举生成树。

接着又发现枚举生成树求出的答案值不会小于原图的答案值

我觉得这句话是废话。


然后这个时候应该复盘刚才的推导,发现如果答案点不在环上,那么刚才一半的结论都不适用了。

不过有了刚才的思考过程,我们可以发现一个生成树依然仅对应一个答案点,只是一个答案点可能对应不止一个生成树。

那么我们当然回去想刚才得到的枚举生成树的方法能否枚举完所有的答案点,接着就会发现因为不可能有答案点没有生成树,所以上面的做法依然可以覆盖所有情况。

然后就可以做了。


回忆刚才的思考过程,总结起来有以下几个方法(我自己瞎取的名字):

  • 简化模型法 Part.1:先考虑在树上怎么做这个问题,然后发现树上这个问题可以轻松求解。

  • 简化模型法 Part.2:这个时候一般有两种思考方向:

    • 这道题中所使用的,试图通过以某种方式处理复杂一些的模型后让简化模型的方法或结论也能适用
    • 尝试把简化问题作为该问题的一个子问题,并尝试将多个简化子问题连接起来
  • 答案倒推法:假设已经知道答案,考虑答案具有哪些性质

  • 忽略次要因素法:把注意力集中到一个问题上,忽略掉其它对这个问题不重要的因素(比如本题中子树内部怎么走)

  • 动态模型思考法:想象模型某个部分运动的时候,整个模型会发生哪些变化

  • 同等问题转化法:如果待求解问题和某个问题又一一对应或者被全覆盖的关系,那么可以考虑解决那个问题来求解当前问题。

posted @ 2025-03-06 15:52  Jerrycyx  阅读(16)  评论(0)    收藏  举报