zoukankan      html  css  js  c++  java
  • 有向图子图 DAG 数量

    考虑 ( t DP),朴素的想法是令 (f_S) 表示 (S) 这个导出子图将边定向集合构成 ( t DAG) 的方案数。

    转移可以考虑剥去所有入度为 (0) 的点,那么我们就需要得到仅存在 (T) 这个子集为 (S) 中入度为 (0) 的点的方法。

    直接做是困难的,考虑容斥。

    强制钦定 (T) 这个子集为 (S) 中入度为 (0) 的点,其他的点不管,(T ightarrow S - T) 的边显然可以连或不连,而 (S - T ightarrow T) 中间的边必须强制不连,这样可以得到转移:

    [f_S = sumlimits_{T subseteq S, T e varnothing} 2 ^ {ways(T, S - T)} imes f_{S - T} ]

    (q_T = 2 ^ {ways(T, S - T)} imes f_{S - T}),令 (S) 中恰好仅有 (T) 做为入度为 (0) 的点的方案为 (p_T),那么有:

    [q_T = sumlimits_{T subseteq S} p_S ]

    根据二项式反演的集合形式,有:

    [p_S = sumlimits_{S subseteq T} (-1) ^ {|T|} q_T ]

    在本题中,我们需要求:

    [egin{aligned} & sumlimits_{T subseteq S, T e varnothing} p_T \ &= sumlimits_{T subseteq S, T e varnothing} sumlimits_{T subseteq R, R subseteq S} (-1) ^ {|R|} q_R \ &= sumlimits_{T subseteq S} (-1) ^ {|T| - 1} q_T end{aligned} ]

    因此有 (f) 的转移:

    [f_S = sumlimits_{T subseteq S, T e varnothing} (-1) ^ {|T| - 1} imes 2 ^ {ways(T, S - T)} imes f_{S - T} ]

    此时只要处理出 (ways(T, S - T)) 即可做到 (mathcal{O}(3 ^ n))

    对于每个 (S),我们考虑单独计算 (ways(T, S - T)(T subseteq S)),将其简写为 (w_T)

    (w_T) 进行 ( t DP),显然每次只需取出一个在 (T) 中的点进行转移即可,可以使用 (mathtt{lowbit}, mathcal{O}(1)) 取出。

    转移只需预处理出 (w1_{i, S}, w2_{i, S}) 分别表示 (i ightarrow S) 中的边数和 (S ightarrow i) 中的边数即可,这部分直接暴力。

    于是本题可以做到时间复杂度 (mathcal{O}(3 ^ n)),空间复杂度 (mathcal{O}(n imes 2 ^ n))

    GO!
  • 相关阅读:
    在linux下的使用复制命令cp,不让出现“overwrite”(文件覆盖)提示的方法。【转】
    Java 学习 day05
    Java 学习 day04
    Java 学习 day03
    Java 学习 day02
    Java 学习 day01
    学习TensorFlow,TensorBoard可视化网络结构和参数
    自编码器及相关变种算法简介
    自编码器(autoencoder)
    卷积神经网络
  • 原文地址:https://www.cnblogs.com/Go7338395/p/14907440.html
Copyright © 2011-2022 走看看