bzoj 4455: [Zjoi2016]小星星 (容斥原理+DP)
2017-03-24 11:26
351 查看
题目描述
传送门
题目大意:给出一个图和一棵树,让树上的点对应图上的点,问有多少种合法的对应方案。题解
一开始想了一个非常不科学的思路.f[i][j][k]表示树中的点i对应图中的点j,i的子树对应的集合是k。但是如果这么写的话不管是容斥还是转移的时间复杂度度都很高,容斥的基本不可做。
然后我们考虑怎样会产生出不合法的对应,那么如果多个点对应了图上的一个点那么一定是不合法的对吧。
那么我们考虑利用容斥:至少0个点对应同一个点-至少1个点对应同一个点+至少两个点对应同一个点……
然后我们每次确定一个集合,规定对应的点必须是集合中的点,然后进行树形DP,保证相邻两个点对应的图中的两个点在图中是有边相连的。
时间复杂度小于O(n^3*2^n),可以乱七八糟优化一下。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define N 20 #define LL long long using namespace std; int n,m,tot,cnt,nxt[1003],point[1003],v[1003],q ; LL f ; bool a ; void add(int x,int y) { tot++; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; tot++; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; } void solve(int sta) { for (int i=0;i<n;i++) if ((sta>>i)&1) q[++cnt]=i+1; } void dp(int x,int fa) { for (int i=1;i<=cnt;i++) f[x][q[i]]=1; for (int i=point[x];i;i=nxt[i]){ if (v[i]==fa) continue; dp(v[i],x); LL ans; for (int j=1;j<=cnt;j++){ ans=0; for (int k=1;k<=cnt;k++) if (a[q[j]][q[k]]) ans+=f[v[i]][q[k]]; f[x][q[j]]*=ans; } } } int main() { freopen("a.in","r",stdin); //freopen("my.out","w",stdout); 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); add(x,y); } LL ans=0; for (int sta=1;sta<=(1<<n);sta++) { cnt=0; solve(sta); memset(f,0,sizeof(f)); dp(1,0); LL sum=0; for (int i=1;i<=cnt;i++) sum+=f[1][q[i]]; //cout<<sum<<endl; if ((n-cnt)&1) ans-=sum; else ans+=sum; } printf("%lld\n",ans); }
相关文章推荐
- bzoj 4455: [Zjoi2016]小星星
- BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]
- 【BZOJ 4455】【UOJ #185】【ZJOI 2016】小星星
- 【BZOJ 4455】【ZJOI 2016】小星星【容斥+树型DP】
- bzoj 4455: [Zjoi2016]小星星
- [BZOJ4455][ZJOI2016]小星星 容斥原理+树型DP
- BZOJ 4455 & UOJ 185 [ZJOI2016]小星星
- [BZOJ4455][Zjoi2016]小星星(容斥原理+树形dp)
- BZOJ4455 ZJOI2016小星星(容斥原理+树形dp)
- [容斥 状压DP 树形DP] BZOJ 4455 [Zjoi2016]小星星 & UOJ #185 【ZJOI2016】小星星
- [BZOJ4455][UOJ185][Zjoi2016]小星星(树形DP+容斥)
- 【bzoj4455】[Zjoi2016]小星星
- [BZOJ]4455: [Zjoi2016]小星星 树形DP+容斥
- 【BZOJ 4455】 [Zjoi2016]小星星 容斥计数
- 【BZOJ 4455】 4455: [Zjoi2016]小星星 (容斥原理+树形DP)
- bzoj 4455: [Zjoi2016]小星星
- [BZOJ4455][Zjoi2016]小星星
- bzoj 4455: [Zjoi2016]小星星 树形dp+容斥原理
- BZOJ 4455: [Zjoi2016]小星星
- [BZOJ4455][Zjoi2016]小星星(容斥原理+树形DP)