1 条题解
-
-2
考虑对于一个点 如何求解 ,考虑一个染色结构是怎样的,每次选择一或两个蓝点,满足与红点与其相连将其染成红色,那么点逐渐被染成红色的过程将形如一个搜索树的过程,具体的,对于每一个染色的蓝点,将之前与其相连的任意一个红点设置为其在搜索树上的父亲,那么就可以得到一棵搜索树。不难发现,当搜索树确定时,答案仅与搜索树的形态有关,因为每一个点可以被染成红色的限制仅为父亲被染成红色,因此 的答案就是所有以 为根的搜索树的答案的最小值,而我们也仅需考虑一棵树的答案是多少。
考虑将原过程倒过来,每次选择一或两个红点将其染蓝,这个过程相当于对于一棵树,如果仅将所有红色的节点视为还剩下的节点,那么这个过程相当于,每一次选择一到两个叶子,将其删除,求最小的删除次数。一个自然的想法是每次删除深度最大的两个叶子,而事实上,它确实是正确的,证明如下:
对于每一个深度 ,令 表示深度为 的点的个数,令 为最大的满足 的数 ,则一个下界是 $\max_{i=0}^{\text{maxd}}(i+\lceil\frac{\sum_{j=i+1}^{\text{maxd}}a_j}{2}\rceil)$,由于每次深度至多只能加 ,而剩下的那些节点每次至多减少 。而对于这个过程,相当于每次找到最大的 使得 ,将 减少 ,这个过程恰好会使得这个下界减少 ,因此这个构造方案总能够使得我们取到下界。而不难发现对于这个下界,其实 树将会达到最小值,因此在最优的方案中,我们得到的树一定是 树,因此不难得到一个 的做法:枚举每一个点 ,求出 树,然后求出 对答案取 。
对于树的情况,可以注意到对于上述匹配算法,我们取到的 总是直径端点,因此可以考虑换一种匹配方式,从直径端点出发,每次让外侧的点与直径上的点进行匹配的操作,因此可以在直径的链上进行这样的 ,从而比较好的做到 的复杂度。对于基环树的情况,可以钦定环上断的边是那一条转化为树的情况进行计算,可以通过在环上预处理 的前后缀和比较轻松的做到这一点。
对于一般图的情况,由于每个点 树的形态的变化会非常复杂,我们是不可以预处理每个点的 树的形态的,但对于树的情况可以提供一个启发,实际上我们只需要关心直径端点的那条分支,这样只需要跑一个点的 树即可。
此时的直径端点该如何设计呢,直接求图的直径显然复杂度太高,但注意到对于一个点双,实际上我们总是可以两两匹配将其消完,和完全图几乎相同,因此我们实际上可以将每一个点双补成一个完全图,这样就非常好求直径了。
在转移时可以建立圆方树,对于一个方点周围的圆点,我们只需要关系在直径端点一侧的那个点在这个点双上的最短路树,这个可以在图上 解决。然后 即可做到 。
- 1
信息
- ID
- 7
- 时间
- 5000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 190
- 已通过
- 7
- 上传者