bzoj 4455: [Zjoi2016]小星星 (容斥原理+DP)
来源:互联网 发布:易云数据vps 编辑:程序博客网 时间:2024/05/22 13:34
题目描述
传送门
题目大意:给出一个图和一棵树,让树上的点对应图上的点,问有多少种合法的对应方案。
题解
一开始想了一个非常不科学的思路.
但是如果这么写的话不管是容斥还是转移的时间复杂度度都很高,容斥的基本不可做。
然后我们考虑怎样会产生出不合法的对应,那么如果多个点对应了图上的一个点那么一定是不合法的对吧。
那么我们考虑利用容斥:至少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[N];LL f[N][N];bool a[N][N];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);}
0 0
- bzoj 4455: [Zjoi2016]小星星 (容斥原理+DP)
- bzoj 4455: [Zjoi2016]小星星 树形dp+容斥原理
- [容斥 状压DP 树形DP] BZOJ 4455 [Zjoi2016]小星星 & UOJ #185 【ZJOI2016】小星星
- uoj185 bzoj 4455: [Zjoi2016]小星星 树形dp&容斥
- [BZOJ]4455: [Zjoi2016]小星星 树形DP+容斥
- 4455: [Zjoi2016]小星星|状压DP|容斥原理
- [BZOJ4455][Zjoi2016]小星星(容斥原理+树形dp)
- [BZOJ4455][Zjoi2016]小星星(容斥原理+树形DP)
- bzoj 4455: [Zjoi2016]小星星
- BZOJ 4455: [Zjoi2016]小星星
- bzoj 4455: [Zjoi2016]小星星
- bzoj 4455: [Zjoi2016]小星星
- 【BZOJ 4455】【ZJOI 2016】小星星【容斥+树型DP】
- [zjoi2016][小星星][容斥]解题报告
- 【BZOJ4455】小星星,容斥原理+树形DP
- BZOJ 4455 & UOJ 185 [ZJOI2016]小星星
- 4455: [Zjoi2016]小星星
- 【ZJOI 2016 小星星】【容斥 + 树形 DP】
- 排序总结
- 欢迎使用CSDN-markdown编辑器
- 打印机常见问题!
- 4类抽奖算法总结
- Unity3D-UGUI的Text组件渐变效果
- bzoj 4455: [Zjoi2016]小星星 (容斥原理+DP)
- 【Java线程】Callable和Future
- 生成格雷码
- Python面试题整理
- FFmpeg编码基础流程
- java中几种创建对象的方式 五
- 工业4.0时代,机器人发展现状及技术趋势揭示
- c# dapper oracle like 参数话
- 数据统计相关(ORACLE)