【清华集训2014】主旋律

【清华集训2014】主旋律

题目大意

给定一张\(n\)个点\(m\)条边的无向图,保证该图整个图为一个强联通分量,保证无重边自环。
现在需要求出:有多少种删边方案,使得删完边后,整个图依旧是一个强联通分量。
数据范围:\(n\leq 15 , m\leq n(n-1)\)

题解

容斥题是真的鸡贼......,这\(TMD\)是人能想出来的?
希望下次自己再来看这篇题解的时候还能看懂吧......
规定\(E[U,V]\)表示出度在\(U\)中,入度在\(V\)中的所有边的集合,其中\(U\)\(V\)为点集。
对于一个点集\(S\),我们随便连边,然后缩点。
那么缩完点后,形成的一定是一个\(DAG\)
我们枚举缩完点后,构成出度为\(0\)\(scc\)的点是哪些,设这个点集为\(T\)
那么每一种\(T\)集合都可以与原来的某些连边方案对应起来。
我们确定完\(T\)后,\(S-T\)中的点先让它随便连,然后\(S-T\)连向\(T\)中的边也可以随便连。
我们可以暂时得到一个式子:
\[2^{E[S,S]} = \sum_{T\subset S,T \neq null} g_T *2^{E[S-T,S-T]}*2^{E[S-T,T]}\]
\(f_S\)表示连完\(E[S,S]\)中的边后,\(S\)整张图为一个强联通分量的方案数,即题目所求。
上式中\(g_T\)表示把\(T\)中的点连成若干强联通分量的方案数。
显然,直接\(g_T = \sum_{s_1,s_2...,s_k} \prod_{k} f_s\)是不对的。
因为由于\(E[S-T,S-T]\)中的边也是随便连的,所以还有可能会形成其他的出度为\(0\)\(scc\)
所以这里应该是存在一个容斥系数的,即:
\[g_T = \sum_{s_1,s_2,...,s_k} coef_k*f_{s_1}f_{s_2}...f_{s_k}\]
我们令这个式子为\(g_T\)的定义式。
考虑一下这个容斥系数\(coef\)到底是什么。
我们设\(r_k\)表示划分成\(k\)个出度为\(0\)\(scc\)的方案数应该要被算几遍,显然\(r_k=1\)
然后我们来推容斥系数\(coef\)应该设为多少才能够使得计算出来的结果与\(r_k\)等效。
对于被划分成\(k\)个出度为\(0\)\(scc\)的方案,
它在划分为\(k-1\)个中被算了\(\binom{k}{k-1}\)次,在划分为\(k-2\)个中被算了\(\binom{k}{k-2}\)次......
所以我们有:
\[r_k = \sum_{j=1}^k\binom{k}{j} coef_j\]
显然是一个二项式反演,结合\(r_k=1\)与二项式定理我们可以得到:
\[coef_k = \sum_{j=1}^k (-1)^{k-j}\binom{k}{j} r_k = ((-1)+1)^k - \binom{k}{0}(-1)^k =(-1)^{k+1}\]
所以我们得到了容斥系数\(coef_k = (-1)^{k+1}\),带入之前\(g_T\)的定义式中:
\[g_T = \sum_{s_1,s_2,...,s_k} (-1)^{k+1} coef_k*f_{s_1}f_{s_2}...f_{s_k}\]
根据容斥系数可以看出,\(g_{null} = -1\)
现在我们终于弄清楚\(g_T\)究竟应该是什么了!
到此为止,所有的准备工作已经就绪,下面开始求答案。
回到这个式子:
\[2^{E[S,S]} = \sum_{T\subset S , T\neq null} g_T *2^{E[S-T,S-T]}*2^{E[S-T,T]}\]
注意到这个式子中是没有\(f\)数组的,所以:
\[g_S = 2^{E[S,S]} - \sum_{T\subsetneqq S , T\neq null} g_T *2^{S-T,S-T} * 2^{E[S-T,T]}\]
所以顺次把\(g\)数组全部推出来即可。
然后我们来研究一下\(g\)的定义式:
\[g_T = \sum_{s_1,s_2,...,s_k} (-1)^{k+1} coef_k*f_{s_1}f_{s_2}...f_{s_k}\]
注意到,每加入一个\(scc\),容斥系数会乘上一个\(-1\)
由于是无序关系,所以我们可以枚举最小编号所在的强联通分量\(s_1\),然后就可以得到:
\[g_T = (-1) * \sum_{s_1 \subset T , s_1 \neq null} f_{s_1} g_{T-s_1}\]
类似之前求\(g\)的技巧,移项可以得到:
\[f_T = g_T + \sum_{s_1 \subsetneqq T, s_1 \neq null} f_{s_1} g_{T-s_1}\]
所以说只要解决了\(g\),就可以顺次推出\(f\),而\(g\)我们已经会求了,所以就做完了。
累死我了.......
不玩了不玩了,再以不玩这种毒瘤题了......

实现代码

#include<bits/stdc++.h>
#define IL inline
#define mod 1000000007
using namespace std ;

int lk[20][20],Inside[(1<<17)],Edge[(1<<17)][20],n,m,pw[233333],pos[(1<<17)] ;
int f[(1<<17)] , g[(1<<17)] , num[(1<<17)] , mx ; 

IL void Pre() {
    for(int i = 1,u,v; i <= m; i ++) cin >> u >> v , lk[u][v] ++ ;
    mx = (1 << n) ; 
    for(int S = 0; S < mx; S ++)
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= n; j ++)
                if((S&(1<<(i-1))) && (S&(1<<(j-1)))) Inside[S] += lk[i][j] ;
    for(int S = 0; S < mx; S ++)
        for(int v = 1; v <= n; v ++) if(S & (1 << (v - 1))) continue ;
            else for(int u = 1; u <= n; u ++)
                     if(S & (1 << (u - 1))) Edge[S][v] += lk[u][v] ;
    for(int S = 0; S < mx; S ++) {
        for(int v = 1; v <= n; v ++) if(S & (1 << (v - 1))) pos[S] = v ;
    }
    pw[0] = 1 ;
    for(int i = 1; i <= m; i ++) pw[i] = (pw[i - 1] << 1) % mod ; return ; 
}

IL void add(int &x , int y) {x += y ; if(x >= mod) x -= mod ; }

int main() {
    freopen("scon.in","r",stdin) ;
    freopen("scon.out","w",stdout) ;
    cin >> n >> m ;
    Pre() ; 
    g[0] = mod - 1 ;
    for(int S = 1; S < mx; S ++) {
        g[S] = pw[Inside[S]] ;
        for(int T = S,tmp; T ; T = (T - 1) & S) {
            num[T] = 0 ; tmp = T ; while(tmp) add(num[T] , Edge[S ^ T][pos[tmp]]) , tmp -= (1 << (pos[tmp] - 1)) ;
        }
        for(int T = S; T ; T = (T - 1) & S) 
            if(S ^ T) add(g[S] , mod - 1ll * g[T] * pw[Inside[S ^ T]] % mod * pw[num[T]] % mod) ;
    }
    for(int S = 1; S < mx; S ++) {
        for(int s1 = S; s1 ; s1 = (s1 - 1) & S) {
            if(s1 & (1 << (pos[S] - 1))) add(f[S] , 1ll * f[s1] * g[S ^ s1] % mod) ; 
        }
        add(f[S] , g[S]) ; 
    }
    cout << f[mx - 1] << endl ; return 0 ; 
}

转载于:https://www.cnblogs.com/GuessYCB/p/10055724.html

【BZOJ3812】【UOJ37】【清华集训2014主旋律 【题目链接】BZOJUOJ【思路要点】我们希望求出使得图强联通的边集数,这等价于求出所有边集数减去使得图不强连通的边集数。首先考虑一种非常暴力的做法,我们枚举最终的图缩点后的情况。那么,剩下的图必须是一个DAG,我们希望求出这张图在是DAG的情况下可行的边集数,并每一个强连通分量加边方案数相乘,得到答案。后面的这个问题是原问题的一个子问题,递归对对应强联通分量的导出子图求解即可。问题在于求解一张... 阅读详情

相关推荐

清华集训2014】【BZOJ3812】主旋律

Description响应主旋律的号召,大家决定让这个班级充满爱,现在班级里面有 n 个男生。 如果 a 爱着 b,那么就相当于 a 和 b 之间有一条 a→b 的有向边。如果这 n 个点的图是强联通的,那么就认为这个班级是充满爱的。 不幸的是,有一些不好的事情发生了,现在每一条边都可能被摧毁。我作为爱的使者,想知道有多少种摧毁的方式,使得这个班级任然充满爱呢?(说人话就是有多少边的子集删去之后

CreationAugust is 14 years old forever 2676

[清华集训2014]主旋律

完全不会做啊,dp 套 dp 真的好难,哭了。

七代目鸽影 511

【UOJ#37】 [清华集训2014] 主旋律

题目链接 题目描述 给定一张强联通图,求有多少种边的存在情况满足图依然强联通。 n≤15n\leq15n≤15 Sol 首先正难则反,考虑用总数减去不强联通的。 考虑一张不强联通的图,缩点后一定是一个 DAG,好像可以对 DAG 进行计数。 诈一看这个做不了,因为缩点后计数是不可能在dp过程中实现的。 但我们按照 DAG 计数的思路的话其实并不需要真的知道 DAG 缩点后的形态。 我们类似 DAG...

Yu Gi Oh! 412

【bzoj3812】【清华集训2014主旋律(容斥,计数)

毒 瘤 计 数! XSY 题意不是很清楚,这里给出更加清楚的: 给定一张 nnn 个点 mmm 条边的无向图,保证该图整个图为一个强联通分量,且无重边自环。现在需要求出:有多少种删边方案,使得删完边后,整个图依旧是一个强联通分量。数据范围:n≤15,m≤n(n−1)n\leq 15,m\leq n(n-1)n≤15,m≤n(n−1)。 记 E[U,V]E[U,V]E[U,V] 表示题目给的所有边中,起点在 UUU 中、终点在 VVV 中的所有边的集合,其中 U,VU,VU,V 为点集。 对于一个点集 SSS

ez_lcw的博客 375

清华集训2014主旋律

清华集训2014主旋律 这个题好难难啊,我想了一个小时连50分都不会,只能去摸周指导了。 解题思路 我们试图直接爆算集合 \(S\) 的非强连通导出子图数量,考虑将这个导出子图的所有强连通分量缩点后,一定是一个点数 \(\geq 2\) 的 \(\text{DAG}\) 。即缩完以后至少要有一个入度为 \(0\) 的点,这个条件充分性显然,必要性考虑如果不存在入度为 \(0\) 的点...

weixin_30379911的博客 905

uoj#37. 【清华集训2014主旋律(状压dp+容斥)

传送门 第一眼容斥,然后我就死活容不出来了…… 记\(f_i\)为点集\(i\)中的点强联通的方案数,那么就是总的方案数减去使\(i\)不连通的方案数 如果\(i\)不连通的话,我们可以枚举缩点之后拓扑序最小(也就是入度为\(0\))的强连通分量,然而这种强联通分量可能不止一个,需要容斥,不难发现这里的容斥系数在强联通分量个数为奇数时为正,为偶数时为负(也就是强联通分量为奇数时要减掉方案数,为偶数...

weixin_34248023的博客 254

主旋律[清华集训2014 Day1]

SOL: 这是最难的一道题。我一脸蒙蔽。 首先我们发现正面做这道题很难。那么我们求答案的补集。 我们把图缩点后,若其为点数大于1的DAG,那么我们就认为其不合法。 利用容斥原理,DAG图的特征是有至少一个入度为0的点并且这个图不止一个点(这里及以下所说的点都是指求强连通后的 点),就根据这个进行容斥。 我们枚举每一个点集。我们发现其子集对答案的贡献是负的。那么我们枚...

132

UOJ37. 【清华集训2014主旋律

http://uoj.ac/problem/37 题解 题目是让我们求出有多少个边集可以使这张图强连通。 先补集转化一下,求这张图不强连通的方案数。 我们考虑这样的图缩完点之后的情况,既然不强连通,那么它就是个\(DAG\)。 回顾一下有向图\(DAG\)计数的方法。 每次新加入一层入度为\(0\)的点,向之前的点连边。但这时我们不能保证我们枚举的点就是全部入度为\(0\)的,所以我们还...

weixin_30919919的博客 253

P11714 [清华集训 2014] 主旋律 题解

本文研究了在n≤15的有向图中求强连通图方案数的问题。通过正难则反的思路,将问题转化为计算非强连通图方案数,并利用状压DP和容斥原理进行求解。作者设计了f[S]和dp[S]两个状态分别表示点集S缩点后的方案数和非强连通方案数,通过子集枚举和位运算优化,将时间复杂度从O(3^n×n^2)优化到O(3^n)。最终答案通过总方案数2^m减去非强连通方案数得到。该算法巧妙运用了状压DP的多种技巧,包括子集枚举、位运算、高维容斥等,成功解决了这一复杂问题。

senlinguyvan1的博客 441

【题解】P11714 [清华集训 2014] 主旋律

怎么办呢,很简单,我们钦定一个点p,显然P只能在一个SCC里,比如p在T1里,那么循环到T2时,p一定不在T2里,考虑只需要让一种划分情况不重,那么其他都不重,那么直接钦定p为S的最低位,只需要让lowbit(T)==lowbit(S)即可。那么想要让S非强联通,那么只要让T内部由若干个SCC组成,然后这样的话,无论T->S-T和S-T自己内部的边怎么连,S都不可能是一个SCC,注意由若干个SCC组成并不等价于缩成一个非强联通,自己手玩一下1->2和2->1即可。

2509_93020071的博客 337

BZOJ3812 清华集训2014 主旋律

直接求出强联通生成子图的数量较难,不妨用所有生成子图的数量减去非强联通的。 非强联通生成子图在所点后满足编号最小的点所在的强联通分量不是全集。 由于$n$很小,我们可以考虑状态压缩。 对于点集$S$,我们钦定一个它的子集$K$入度数为$0$,希望除去$K$以外的$S$度数不为$0$ 设钦定$K$的度数为$0$其他随意的方案数为$H_{S,K}=2^{sum_S-sum_{\{S^...

weixin_30832351的博客 137

UOJ#37. 【清华集训2014主旋律

题目大意:   传送门 题解:   神题……Orz。   首先正难则反。   设$f_S$表示选取点集状态为s时,这部分图可以构成非强联通图的方案数。   设$p_{S,i}$表示点集s缩点后有i个入度为0点的方案数,保证$i<|S|$。   设$e[S,T]$表示从S集合到T集合的边数。   很显然有。   好吧,并不显然……还是来解释一下……   考虑求$f_S$,我...

weixin_30376323的博客 115

UOJ#37.【清华集训2014主旋律 状压DP

状压DP+容斥原理

NeighThorn的博客 1458
上一篇: 清北冬令营训练计划
下一篇: 关于min_25筛的一些理解
df4516
博客等级 码龄12年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值