1 条题解

  • 0
    @ 2025-8-24 23:01:16

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Rainbow_qwq
    **

    搬运于2025-08-24 23:01:16,当前版本为作者最后更新于2024-07-23 22:14:03,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    D2T3 树形图

    首先判掉一些 case:先 tarjan 一遍求出强连通分量,找到一个能到达所有点的强连通分量(也可能找不到),那么 1,21,2 类点只可能在这个强连通分量中。

    若其中没有 11 类点,则强连通分量内所有点都为 22 类点。

    11 类点的性质是:将任意一个 11 类点定为根,求出一棵 dfs 树,则图上的非树边只有返祖边,没有横叉边。

    求出 11 类点

    以任意一个 11 类点定为根,求出一棵 dfs 树。考虑在这棵 dfs 树的基础上求出所有 11 类点:

    考虑 fauufa_u\to u 这条边被几条返祖边覆盖了,由于这是一个强连通分量,所以子树中至少有一条返祖边覆盖 fauufa_u\to u

    若有 2\ge 2 条返祖边覆盖了 fauufa_u\to u,则 ufauu\to fa_u 有至少两种方案能走到,uu 必然不为 11 类点。

    若只有 11 条返祖边覆盖了 fauufa_u\to u,设这条边为 xyx\to y,则 uu 子树中的点向上走必然要走到 yyuu 是否为 11 类点等价于 yy 是否为 11 类点。于是可以从上到下递推出所有 11 类点。

    求出 22 类点

    仍然在这棵 dfs 树的基础上求出 22 类点。

    如果一个 uu11 类点,那么一定有恰好一条返祖边 xyx\to y 覆盖了 fauufa_u\to u,并且这条返祖边不能删除,否则 xx 的子树就会脱离这个强连通分量,从而不再是 11 类点。

    于是我们得到了若干条返祖边不能删除的限制。

    假设我们想判定 uu,也就是删去若干条边把 uu 变为 11 类点,则我们想删去覆盖了 fauufa_u\to u 的若干条返祖边,使得只剩下一条 (x,y)(x,y) 覆盖了 fauufa_u\to u,并且 yy 也是 1/21/2 类点,那么 uu 就可以成为 22 类点了。

    对于一个点 uu,仍然考虑 ufauu\to fa_u 这条边:

    若被两条不能删除的返祖边覆盖,则 uu 一定不可行。

    若被一条不能删除的返祖边覆盖:设这条边为 xyx\to y,则 uu 是否为 22 类点等价于 yy 是否为 1/21/2 类点。

    若被零条不能删除的返祖边覆盖:那么 uu 子树中有若干条能删除的返祖边。若能找到一条能删除的返祖边 xyx\to y,使得 yy1/21/2 类点,则 uu 就可以为 22 类点。

    如何找一个 11 类点

    考虑以 11 类点为根构成的 dfs 树的性质。观察其叶子,由于没有横叉边,所有叶子必然满足入度为 11

    对于所有入度为 11 的点 uu,假设有边 vuv\to u,则可以把 uuvv 合并。具体来说,把 uu 的出边并到 vv 的出边里(所有 uxu\to x 改为 vxv\to x不需要去除重边,但要删去自环),然后删除点 uu。也就是在 dfs 树上不断缩叶子的过程。

    BFS 不断执行这个过程,并把新出现的入度为 11 的点加入队列里。

    在若干轮删除之后,若只剩下 11 个点,则这个点即可作为 11 类点;否则若某个时刻每个点入度都 2\ge 2,则不存在 11 类点。

    使用启发式合并维护边集,时间复杂度 O((n+m)logn)O((n+m)\log n)

    可以用 vector 存下每个点的入边和出边,合并时按两个 size 的和加权,取更小的点的所有边合并到大的点上,这样在合并时就可以计算有多少条 uvu-v 的边。

    • 1

    信息

    ID
    10560
    时间
    3000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者