1 条题解

  • 2
    @ 2023-5-5 8:53:23

    自己做法假了,乐,瞄了眼题解。

    根本不用定序,只用粗略地知道缩点后 00 入度点集即可。

    f(S)f(S)SS 为强连通图的方案数。

    f(S,T)f(S,T) 表示全集为 SS,SCC 缩点后点集 TT 中所有元素均入度为 00 的方案数。考虑对于 S/TS/T 的点,我们把其乱连,和 TT 之间只保留 TS/TT\rightarrow S/T 的边,而对于 TT 内部的点拆成若干互不相交的强连通分量,从而

    f(S,T)=w(T)2h(S,S/T)f(S,T)=w(T)2^{h(S,S/T)}

    其中 $w(T)=\sum_{\bigcup\mathcal U=T,\forall_{A,B\in\mathcal U,A\neq B}A\cap B=\varnothing}\prod_{A\in\mathcal U}f(A)$。

    如果枚举 TT 并求和,考虑到可能计重,我们设有容斥系数 g(S,T)g(S,T),使得

    $$\sum_{T\subseteq S,T\neq\varnothing}g(S,T)f(S,T)=2^{h(S,S)} $$

    考虑这样的容斥系数是怎样的:对一种 SS 上的方案,若其 00 度点集恰好对应于 TT,其可能会被多个 ATA\subseteq T 枚举到,故有

    AT,Ag(S,A)=1\sum_{A\subseteq T,A\neq\varnothing}g(S,A)=1

    从而 g(S,T)=(1)T1g(S,T)=(-1)^{|T|-1}

    于是

    $$\sum_{T\subseteq S,T\neq\varnothing}(-1)^{|T|-1}f(S,T)=2^{h(S,S)} $$

    从而

    $$w(S)=\sum_{T\subsetneq S}(-1)^{|S|-|T|-1}w(T)2^{h(S,S/T)} $$

    特别地,w()=1w(\varnothing)=1

    对于 f(S)f(S),则考虑枚举首个点所在 SCC,容易有

    $$f(S)=w(S)-\sum_{T\subsetneq S,\min T=\min S}f(T)w(S/T) $$

    暴力进行子集枚举,总复杂度 O(3n)O(3^n)

    不知道为啥代码里还要乘个 (1)n1(-1)^{n-1}。。。

    • 1

    信息

    ID
    3812
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    (无)
    递交数
    34
    已通过
    13
    上传者