NOIp模拟赛 巨神兵(状压DP 容斥)
\(Description\)
给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环。
\(n\leq17\)。
\(Solution\)
问题也等价于,用不同的边集构造DAG,有多少种合法方案。我们考虑怎么构造DAG使得方案不重不漏。
我明知道一个DAG的拓扑序是唯一确定的。所以我们按照拓扑序每次转移一个点集。
\(f[s][s']\)表示 构造 已经选择的点集为\(s\),当前最后一层点集为\(s'\)的DAG 的方案数。
转移时枚举不在\(s\)中的子集\(k\),\(k\)合法首先要满足\(s'\)与\(k\)中所有点有边。
然后设\(s\oplus s'\)与k中某点的连边有\(cnt1_i\)条,\(s'\)与\(k\)中该点的连边有\(cnt2_i\)条,则该点的合法方案数为\(2^{cnt1_i}\times(2^{cnt2_i}-1)\)。
\(f[s|k][k]=\sum f[s][s']\times\prod 2^{cnt1_i}\times(2^{cnt2_i}-1)\)。
复杂度\(O(4^n\times m)\)。
考虑减掉第二维。直接枚举当前点集\(i\),然后枚举补集的子集\(j\)。只要还是按层加入节点就能保证是DAG。
\(i,j\)之间可以不存在边,设\(i\)连向\(j\)的边有\(cnt\)条,则\(f[i|j]+=f[i]\times 2^j\)?
当然没这么简单。容易发现\(i|j\)可以由很多组\(i,j\)构成。所以加个容斥,容斥系数是\((-1)^{sz[j]+1}\)。
不是很懂这个容斥系数。。是加1个点的然后减去还可以由两个点的...?
复杂度\(O(3^nm)\),可以优化到\(O(3^n+2^nm)\)(不管了)(虽然最大数据要跑10s+...)。
https://blog.csdn.net/ylsoi/article/details/80427659
https://www.cnblogs.com/KaNNeXFF/p/5942983.html
#include <cstdio>
#include <cctype>
#include <algorithm>
#define In(x,s) (s>>x&1)
#define gc() getchar()
#define mod 1000000007
const int N=20,S=(1<<17)+3;
int n,m,pw[N*N],mp[N][N],num[N][S],f[S];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int Calc(int s)
{
int res=0;
for(; s; s>>=1) res+=s&1;
return res;
}
int main()
{
freopen("E.in","r",stdin);
freopen("E.out","w",stdout);
n=read(),m=read();
pw[0]=1;
for(int i=1; i<=m; ++i) pw[i]=pw[i-1]<<1, pw[i]>=mod&&(pw[i]-=mod);
for(int i=1; i<=m; ++i) mp[read()-1][read()-1]=1;
int all=(1<<n)-1;
for(int s=0; s<=all; ++s)
for(int v=0; v<n; ++v)
if(In(v,s))
for(int x=0; x<n; ++x) num[x][s]+=mp[x][v];
f[0]=1;
for(int i=0; i<=all; ++i)
{
if(!f[i]) continue;
int rest=all^i;
for(int j=rest; j; j=(j-1)&rest)
{
int sz=Calc(j), cnt=0;
for(int k=0; k<n; ++k)
if(In(k,i)) cnt+=num[k][j];
if(sz&1) f[i|j]+=1ll*f[i]*pw[cnt]%mod, f[i|j]>=mod&&(f[i|j]-=mod);
else f[i|j]-=1ll*f[i]*pw[cnt]%mod-mod, f[i|j]>=mod&&(f[i|j]-=mod);
}
}
printf("%d\n",f[all]);
return 0;
}
NOIp模拟赛 巨神兵(状压DP 容斥)的更多相关文章
- 2018.10.17 NOIP模拟 管道(状压dp)
传送门 状压dp好题. 怎么今天道道题都有点东西啊 对于今天题目神仙出题人先膜为上策:%%%%DzYoAk_UoI%%%% 设f[i][j]f[i][j]f[i][j]表示选取点的状态集合为iii,当 ...
- 2018.09.08 NOIP模拟 division(状压dp)
这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...
- 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)
[描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...
- BZOJ 3812 主旋律 (状压DP+容斥) + NOIP模拟赛 巨神兵(obelisk)(状压DP)
这道题跟另一道题很像,先看看那道题吧 巨神兵(obelisk) 题面 欧贝利斯克的巨神兵很喜欢有向图,有一天他找到了一张nnn个点mmm条边的有向图.欧贝利斯克认为一个没有环的有向图是优美的,请问这张 ...
- 4.26 省选模拟赛 T3 状压dp 差分求答案
LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...
- codeforces 342D Xenia and Dominoes(状压dp+容斥)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...
- bzoj2669 [cqoi2012]局部极小值 状压DP+容斥
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2669 题解 可以发现一个 \(4\times 7\) 的矩阵中,有局部最小值的点最多有 \(2 ...
- 一本通 1783 矩阵填数 状压dp 容斥 计数
LINK:矩阵填数 刚看到题目的时候感觉是无从下手的. 可以看到有n<=2的点 两个矩形. 如果只有一个矩形 矩形外的方案数容易计算考虑 矩形内的 必须要存在x这个最大值 且所有值<=x. ...
- P3160 [CQOI2012]局部极小值 题解(状压DP+容斥)
题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示 ...
随机推荐
- bzoj千题计划283:bzoj4516: [Sdoi2016]生成魔咒(后缀数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=4516 考虑在后面新加一个字母产生的影响 假设是第i个 如果不考虑重复,那么会增加i个不同的字符串 考 ...
- 蓝桥杯 带分数 DFS应用
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- win10内建子系统Linux
从cmd中下载linux和linux终端安装程序一样 最新要从商店购买(当然是免费) ubuntu openSUSE SUSE 3个 创建用户
- git与代码托管工具
1.git初识 git是一个版本管理工具,用来管理项目的不同的版本,记录下不同的提交记录,git还可以构建不同的分支,用来给不同的人来推送使用. 推荐的git教程:https://www.cnblog ...
- 利用backtrace和ucontex定位segment错误【转】
转自:https://blog.csdn.net/gqtcgq/article/details/53883546 C程序运行时,经常会碰到”segmentfault”错误.这是由于程序中非法访问内存导 ...
- node.js express开发web问题
1.新建的layout.ejs,在里面使用了<%= title %>,但是在运行时提示title is not defined. 将title改为<%= locals.title % ...
- node.js开发web
1.安装express框架 使用npm install -g express安装express后,在命令行中执行express,提示没有此命令 原因是在新版的express中命令行需要单独安装 npm ...
- java实现xml格式与javabean之间的转换XmlUtil类
XmlUtil类:不多说,直接撸代码: /** * java 转换成xml * @Title: toXml * @Description: TODO * @param obj 对象实例 * @retu ...
- java.io.StreamCorruptedException: invalid stream header: EFBFBDEF 问题解决
错误方式 @Test public void testDeserializeTest() throws IOException, ClassNotFoundException { ByteArrayO ...
- java 把被检查的异常转换为不检查的异常
一.当我们不知道该怎么处理这个异常,但是也不想把它"吞"了,或者打印一些无用的信息,可以使用异常链的思路解决.可以直接报"被检查的异常"包装进RuntimeEx ...