3812: 主旋律

题意:一张有向图,求它的生成子图是强连通图的个数。\(n \le 15\)


先说一个比较暴力的做法。

终于知道n个点图的是DAG的生成子图个数怎么求了。

暴力枚举哪些点是一个scc,然后缩点,枚举入度为0的点,容斥原理dp DAG个数

\[d(S) = \sum_{T \subset S, T \neq \varnothing}(-1)^{\mid T\mid-1}2^{w(T,S-T)}d(S-T)
\]


巧妙的做法是直接枚举缩点入度为0的点(即那些scc有哪些点)

\(f(S)\) S的生成子图是强连通的个数

\(g(S)\) S拆成奇数个scc - S拆成偶数个scc. 原因是上面那个DP.

\(h(S)\) 诱导子图S的边数

\[f(S) = 2^{h(S)} - \sum_{T \subset S, T \neq \varnothing} g(T) 2^{w(T, S-T)} 2^{h(S-T)} \\
g(S) = f(S) - \sum_{T \subset S, T \neq \varnothing,T\neq S,p\in T}f(T)g(S-T)
\]

注意要把拆成一个单独拿出来,因为更新f用到的g不能是拆成一个!


感觉很巧妙,利用g,相当于把原来不同枚举方案中的DP一块做了!

复杂度\(O(3^n)\)


代码中有一些实现技巧。特别注意怎样固定p在T中

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = (1<<16) + 5, mo = 1e9+7;
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x*f;
} int n, m, u, v, f[N], g[N], h[N], one[N], w[N], ins[N], outs[N];
ll mi[N];
int main() {
//freopen("in", "r", stdin);
n = read(); m = read();
for(int i=1; i<=m; i++) {
u = 1 << (read()-1); v = 1 << (read()-1);
outs[u] |= v; ins[v] |= u;
}
mi[0] = 1;
for(int i=1; i<=m; i++) mi[i] = mi[i-1] * 2 %mo;
for(int s = 1; s < 1<<n; s++) one[s] = 1 + one[s ^ (s & -s)];
for(int s = 1; s < 1<<n; s++) {
int p = s & -s, ns = s ^ p;
for(int t = ns; t; t = (t-1) & ns)
g[s] = (g[s] - (ll) f[s ^ t] * g[t]) %mo;
h[s] = h[ns] + one[ins[p] & ns] + one[outs[p] & ns]; f[s] = mi[h[s]];
for(int t = s; t; t = (t-1) & s) {
int p = (s^t) & -(s^t);
if(t == s) w[t] = 0;
else w[t] = w[t ^ p] - one[outs[p] & (s^t)] + one[ins[p] & t];
f[s] = (f[s] - (ll) g[t] * mi[w[t] + h[s^t]]) %mo;
}
if(f[s] < 0) f[s] += mo;
g[s] = (g[s] + f[s]) %mo;
}
printf("%d", f[(1<<n) - 1]);
}

bzoj 3812: 主旋律 [容斥原理 状压DP]的更多相关文章

  1. 【bzoj2669】[cqoi2012]局部极小值 容斥原理+状压dp

    题目描述 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点)都小,我们说这个格子是局部极小值. 给出所有局部极小值的位置,你的任 ...

  2. bzoj 2669 题解(状压dp+搜索+容斥原理)

    这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...

  3. HDU 4336 容斥原理 || 状压DP

    状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...

  4. BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)

    (Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...

  5. BZOJ 1087 题解【状压DP】

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3112  Solved: 1816[Submit][ ...

  6. BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )

    状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...

  7. BZOJ 4057: [Cerc2012]Kingdoms( 状压dp )

    状压dp.... 我已开始用递归结果就 TLE 了... 不科学啊...我dp基本上都是用递归的..我只好改成递推 , 刷表法 将全部公司用二进制表示 , 压成一个数 . 0 表示破产 , 1 表示没 ...

  8. BZOJ 2073: [POI2004]PRZ( 状压dp )

    早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...

  9. #186 path(容斥原理+状压dp+NTT)

    首先只有一份图时显然可以状压dp,即f[S][i]表示S子集的哈密顿路以i为终点的方案数,枚举下个点转移. 考虑容斥,我们枚举至少有多少条原图中存在的边(即不合法边)被选进了哈密顿路,统计出这个情况下 ...

随机推荐

  1. UVALive3882-And Then There Was One-约瑟夫问题-递推

    And Then There Was One Time limit: 3.000 seconds Let's play a stone removing game. Initially, n ston ...

  2. BZOJ 3105: [cqoi2013]新Nim游戏

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意是要取一些数使得剩余的数xor和的子集不为0 拟阵.求解极大线性无关组.贪心从大到小 ...

  3. 如何在VS2017中使用快捷键格式化代码?

    1.同时按住Ctrl键+A键,全选代码或要格式化的部分代码: 2.再按住Ctrl键,接着按一下K键,接着按一下F键.(注意:Ctrl键在按后面这2个键的时候一直是按着的,直到F键按完才松开).也就是俗 ...

  4. UE4 径向模糊radiu blur

    hlsl代码为: float2 ScreenMult = ; ; ] = {-0.08,-0.05,-0.03,-0.02,-0.01,0.01,0.02,0.03,0.05,0.08}; float ...

  5. oracle修改表列名和列类型

    --修改列名alter table 表名 rename column 旧列名 to 新列名;--修改列类型alter table 表名 modify (列名varchar(255));

  6. PHP开发api接口安全验证

    php的api接口 在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道 ...

  7. Struts2学习笔记NO.1------结合Hibernate完成查询商品类别简单案例(工具IDEA)

    Struts2学习笔记一结合Hibernate完成查询商品类别简单案例(工具IDEA) 1.jar包准备 Hibernate+Struts2 jar包 struts的jar比较多,可以从Struts官 ...

  8. No grammar constraints (DTD or XML schema).....两种解决方法

    方法一:常用方法   关闭XML验证 工具栏:windows => preferences => xml => xml files => validation => In ...

  9. 一个简单的div弹出层的小例子

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  10. 第二章 在HTML中使用JS

    script 标签 属性 src   : 可选 包含要执行的外部文件 type : 表示编写代码使用的脚本语言的内容类型(MINI类型) text/javascript async: 可选 只对外部脚 ...