zoukankan      html  css  js  c++  java
  • 【清华集训 2014】主旋律

    考虑容斥,统计不为强连通图的子图数量。

    同时考虑 ( t DP),令 (g_S) 表示 (S) 这个子集的导出子图的子图构成强连通图的方案。

    朴素的转移想法是暴力集合划分 (S) 中的点(至少划分成两个集合),每个点集内部构成强连通图,整体缩点后跑有向图子图 ( t DAG) 数即可。

    这样显然复杂度爆炸,无法通过本题。

    常见的想法是将两个部分和为一体,回忆有向图子图 ( t DAG) 数的做法,令 (f_S) 为点集 (S) 的导出子图的子图 ( t DAG) 数,有转移:

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

    由此我们只需直到选出 (T) 构成若干个强连通分量的贡献和即可,而不需要直到具体的强连通分量划分,令这个量为 (h_T)

    (h_0 = -1),有转移:

    [h_S = -sumlimits_{T subseteq S, T e varnothing} g_T imes h_{S - T} ]

    但由于集合是无标号的,因此这样会记重,常见的想法是每次钦定 (S) 中最后一个数(取 ( t lowbit))在 (T) 中即可。

    此时我们直接改写 (f_S) 的状态,表示点集 (S) 的导出子图的子图不构成强连通分量的方案,那么有转移:

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

    显然有 (g_S = 2 ^ {ways(S, S)} - f_S)

    注意以下转移的顺序,我们先转移 (h),但不转移 (S ightarrow S),这样可以保证 (f) 不出现仅由单个强连通分量组成的情况。

    转移完 (f) 后我们再转移 (h) 中单个强连通分量的情况。

    复杂度 (mathcal{O}(3 ^ n))

    GO!
  • 相关阅读:
    springbatch入门练习(第一篇)
    rabbitmq安装错误集
    动态代理和反射概念剖析
    RPC使用rabbitmq实现
    spring amqp初步了解
    aips初步设想
    静态工厂方法和实例工厂方法及普通的bean
    HDU4403(暴搜)
    CodeForces 446B
    HDU5505
  • 原文地址:https://www.cnblogs.com/Go7338395/p/14907444.html
Copyright © 2011-2022 走看看