4455: [Zjoi2016]小星星|状压DP|容斥原理
2018-02-03 17:39
441 查看
OrzSDOIR1ak的晨神
能够考虑状压DP枚举子集,求出仅仅保证连通性不保证一一相应的状态下的方案数,然后容斥一下就是终于的答案
能够考虑状压DP枚举子集,求出仅仅保证连通性不保证一一相应的状态下的方案数,然后容斥一下就是终于的答案
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<cmath> #include<queue> #include<ctime> #include<set> #include<map> using namespace std; bool a[22][22]; long long f[22][22],ans; int head[44],nxt[44],lst[44],q[44]; int n,m,tot,w; void insert(int x,int y) { lst[++tot]=y; nxt[tot]=head[x]; head[x]=tot; lst[++tot]=x; nxt[tot]=head[y]; head[y]=tot; } void dp(int x,int fa) { for(int i=head[x];i;i=nxt[i]) if(lst[i]!=fa)dp(lst[i],x); for(int i=1;i<=w;i++) { f[x][q[i]]=1; for(int j=head[x];j;j=nxt[j]) if(lst[j]!=fa) { long long tmp=0; for(int k=1;k<=w;k++) if(a[q[i]][q[k]])tmp+=f[lst[j]][q[k]]; f[x][q[i]]*=tmp; } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); a[x][y]=a[y][x]=1; } for(int i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); insert(x,y); } for(int S=1,T=1<<n;S<T;S++) { w=0; for(int i=1;i<=n;i++) if((1<<i-1)&S)q[++w]=i; long long sum=0;dp(1,0); for(int i=1;i<=w;i++)sum+=f[1][q[i]]; if((w^n)&1) ans-=sum; else ans+=sum; } cout<<ans; return 0; }
相关文章推荐
- 4455: [Zjoi2016]小星星|状压DP|容斥原理
- 【BZOJ 4455】 4455: [Zjoi2016]小星星 (容斥原理+树形DP)
- [BZOJ4455][Zjoi2016]小星星(容斥原理+树形dp)
- [容斥 状压DP 树形DP] BZOJ 4455 [Zjoi2016]小星星 & UOJ #185 【ZJOI2016】小星星
- BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]
- BZOJ4455 ZJOI2016小星星(容斥原理+树形dp)
- [BZOJ4455][Zjoi2016]小星星(容斥原理+树形DP)
- 4455[Zjoi2016]小星星 容斥+dp
- BZOJ 4455 & UOJ 185 [ZJOI2016]小星星
- bzoj 4455: [Zjoi2016]小星星 (容斥原理+DP)
- [BZOJ4455][Zjoi2016]小星星
- [BZOJ]4455: [Zjoi2016]小星星 树形DP+容斥
- BZOJ 4455: [Zjoi2016]小星星
- 【BZOJ 4455】【ZJOI 2016】小星星【容斥+树型DP】
- 【BZOJ 4455】【UOJ #185】【ZJOI 2016】小星星
- bzoj 4455: [Zjoi2016]小星星
- 【BZOJ 4455】 [Zjoi2016]小星星 容斥计数
- 【bzoj4455】[Zjoi2016]小星星
- [BZOJ4455][ZJOI2016]小星星 容斥原理+树型DP
- bzoj 4455: [Zjoi2016]小星星