1 条题解

  • -2
    @ 2026-4-30 12:56:10

    考虑对于一个点 xx 如何求解 F(x)F(x),考虑一个染色结构是怎样的,每次选择一或两个蓝点,满足与红点与其相连将其染成红色,那么点逐渐被染成红色的过程将形如一个搜索树的过程,具体的,对于每一个染色的蓝点,将之前与其相连的任意一个红点设置为其在搜索树上的父亲,那么就可以得到一棵搜索树。不难发现,当搜索树确定时,答案仅与搜索树的形态有关,因为每一个点可以被染成红色的限制仅为父亲被染成红色,因此 F(x)F(x) 的答案就是所有以 xx 为根的搜索树的答案的最小值,而我们也仅需考虑一棵树的答案是多少。

    考虑将原过程倒过来,每次选择一或两个红点将其染蓝,这个过程相当于对于一棵树,如果仅将所有红色的节点视为还剩下的节点,那么这个过程相当于,每一次选择一到两个叶子,将其删除,求最小的删除次数。一个自然的想法是每次删除深度最大的两个叶子,而事实上,它确实是正确的,证明如下:

    对于每一个深度 dd,令 ada_d 表示深度为 dd 的点的个数,令 maxd\text{maxd} 为最大的满足 au1a_u\geq 1 的数 uu,则一个下界是 $\max_{i=0}^{\text{maxd}}(i+\lceil\frac{\sum_{j=i+1}^{\text{maxd}}a_j}{2}\rceil)$,由于每次深度至多只能加 11,而剩下的那些节点每次至多减少 22。而对于这个过程,相当于每次找到最大的 pp 使得 ap>1a_p>1,将 amaxd,apa_{\text{maxd}},a_p 减少 11,这个过程恰好会使得这个下界减少 11,因此这个构造方案总能够使得我们取到下界。而不难发现对于这个下界,其实 bfs\text{bfs} 树将会达到最小值,因此在最优的方案中,我们得到的树一定是 bfs\text{bfs} 树,因此不难得到一个 O(n2)O(n^2) 的做法:枚举每一个点 xx,求出 bfs\text{bfs} 树,然后求出 F(x)F(x) 对答案取 max\text{max}

    对于树的情况,可以注意到对于上述匹配算法,我们取到的 amaxda_{\text{maxd}} 总是直径端点,因此可以考虑换一种匹配方式,从直径端点出发,每次让外侧的点与直径上的点进行匹配的操作,因此可以在直径的链上进行这样的 dp\text{dp},从而比较好的做到 O(n)O(n) 的复杂度。对于基环树的情况,可以钦定环上断的边是那一条转化为树的情况进行计算,可以通过在环上预处理 size\text{size} 的前后缀和比较轻松的做到这一点。

    对于一般图的情况,由于每个点 bfs\text{bfs} 树的形态的变化会非常复杂,我们是不可以预处理每个点的 bfs\text{bfs} 树的形态的,但对于树的情况可以提供一个启发,实际上我们只需要关心直径端点的那条分支,这样只需要跑一个点的 bfs\text{bfs} 树即可。

    此时的直径端点该如何设计呢,直接求图的直径显然复杂度太高,但注意到对于一个点双,实际上我们总是可以两两匹配将其消完,和完全图几乎相同,因此我们实际上可以将每一个点双补成一个完全图,这样就非常好求直径了。

    在转移时可以建立圆方树,对于一个方点周围的圆点,我们只需要关系在直径端点一侧的那个点在这个点双上的最短路树,这个可以在图上 bfs\text{bfs} 解决。然后 dp\text{dp} 即可做到 O(n)O(n)

    • 1

    信息

    ID
    7
    时间
    5000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    190
    已通过
    7
    上传者