BZOJ 4455: [Zjoi2016]小星星
2016-09-12 21:06
567 查看
liaoliaoSB的题就先做到这了~毕竟后缀数组不好。。借口
这题可是高深的容斥原理啊,你要我证我可证不清楚。
做法: 先不限制一对一,我们可以通过枚举哪几个不选,求出全部集合的并集(至少0个禁止选的-至少1个禁止选的+至少2个禁止选的..),集合i是指不选i的情况
最后补集就是答案了。。。
代码:(短+快~)
这题可是高深的容斥原理啊,你要我证我可证不清楚。
做法: 先不限制一对一,我们可以通过枚举哪几个不选,求出全部集合的并集(至少0个禁止选的-至少1个禁止选的+至少2个禁止选的..),集合i是指不选i的情况
最后补集就是答案了。。。
代码:(短+快~)
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; struct node{int y,next;}a[40]; int first[20],len; void ins(int x,int y) { a[++len].y=y,a[len].next=first[x],first[x]=len; } bool v[20][20]; int al,p[20]; LL f[20][20]; void dfs(int x,int fa) { int i,j,k,y; LL s; for(k=first[x];k;k=a[k].next) { y=a[k].y; if(y==fa)continue; dfs(y,x); } for(i=1;i<=al;i++) { f[x][i]=1; for(k=first[x];k;k=a[k].next) { y=a[k].y; if(y==fa)continue; s=0; for(j=1;j<=al;j++)if(v[p[i]][p[j]])s+=f[y][j]; f[x][i]*=s; } } } int main() { int n,m,x,y,i,j; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); v[x][y]=v[y][x]=1; } for(i=1;i<n;i++)scanf("%d%d",&x,&y),ins(x,y),ins(y,x); LL ans=0,s; for(i=0;i<(1<<n)-1;i++) { al=0; for(j=1;j<=n;j++)if( !(i&(1<<j-1)) )p[++al]=j; dfs(1,0); s=0; for(j=1;j<=al;j++)s+=f[1][j]; if( (n-al)&1 )ans-=s; else ans+=s; } printf("%lld\n",ans); return 0; }
相关文章推荐
- G1 垃圾回收
- Opencv之<Vec3b>是什么东东
- hibernate乐观锁
- JPA
- Graph
- MongoDB基本使用
- Python基础-sort()函数
- Ubuntu+Apache+PHP+Mysql环境搭建(完整版)
- openstack安装问题
- Hibernate 乐观锁实现之 Version
- 职责链
- leetcode【121+122+123 best time to buy and sell stock】【python】
- 初探ELK-kibana使用小结
- 平衡二叉树(AVL)
- linux下 安装 oracle11g 错误 Can't open display: xxx
- Dapper.NET使用入门(二)【Helper】
- Java-NowCoder-进制转换
- HDU 5875 Function ST + 二分区间
- 如何优化网页加载速度
- HDU 5875 Function st + 二分