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;
}
转载于:https://www.cnblogs.com/SovietPower/p/9626940.html
NOIp模拟赛 巨神兵(状压DP 容斥)相关推荐
- [CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)
problem luogu-P3160 solution 这么小的数据范围,非暴力不状压.暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了. 我们不妨从小到大填数字,这样如果局部极小值点还 ...
- bzoj2560串珠子 状压dp+容斥(?)
2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 515 Solved: 348 [Submit][Status][Discuss ...
- 【NOIP模拟赛】超级树 DP
这个题我在考试的时候把所有的转移都想全了就是新加一个点时有I.不作为II.自己呆着III.连一个IV.连接两个子树中的两个V连接一个子树中的两个,然而V我并不会转移........ 这个题的正解体现了 ...
- BZOJ 2073: [POI2004]PRZ( 状压dp )
早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...
- NOIP模拟 整数划分(数论,质因数分解,状压DP)
这道题竟然暴力能拿到90分,大佬orzorzorz%%%%%%%%%%% --------------------------分割线(下面是正解)--------------------------- ...
- 【2022国赛模拟】无损加密——LGV引理、状压DP
原创题无来源 题目描述 题解 首先把问题稍作简化,我们可以最后把行列式乘上所有 dkd_kdk 的积的 nnn 次方,这样前面的过程就不用考虑 dkd_kdk 了,暴力也只需要变动 [lk,rk] ...
- 【gmoj4743】【8.11模拟赛T1】积木【状压DP/暴搜】
题目链接:积木 分析 这题数据也太水了吧我喜欢 可以直接暴力搜索每一个积木的每一个顺序的每一种放置方法. 阶乘级别的复杂度,居然能过就离谱. 正解是状压DP.f[i][j][k]f[i][j][k]f ...
- nyoj1273 河南省第九届省赛_宣传墙、状压DP+矩阵幂加速
宣传墙 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...
- 糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc
糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) xzc 2019/4/5 试题 I: 糖果 时间限制: 1.0s 内存限制: 256.0MB 本题总分:25分 [问题描述] ...
- BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)
(Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...
最新文章
- xmarin.android导航栏,android – 如何在xamarin表单中更改导航页面后退按钮
- lazada开店平台费用都有哪些,产品如何来做定价?
- openresty开发系列21--lua的模块
- 阿里文娱测试开发专家谈《算法基石:实时数据质量如何保障?》
- 《剑指offer》构建乘积数组
- 情商低的七种表现,你占了几个
- 重磅!彭博社“机器学习基础”教程视频及讲义下载
- 如何做一个国产数据库(六) 网络传输 nodejs做测试客户端
- Python 集合定义及运算
- IDEA Debug 无法进入断点的解决方法
- 吃了核辐射食物怎么办_不瞒你说:经常胃酸烧心怎么办?,多吃这些食物,保护胃黏膜远...
- vmware 14 pro许可证
- 小管家进销存_管钱、管货、管顾客,“北漂”京东便利店主点赞掌柜管家
- Ubuntu18.04grub增加console口输出
- python 追加写文件_python怎么追加写入文件
- 开发一个渐进式Web应用程序(PWA)前都需要了解什么?
- CrownCAD二次开发,从中国结代码看代码简洁之美
- 人工智能作业之产生式推理系统
- beautifulsoup解析
- Git冲突与解决冲突