就是求无根树的本质不同的独立集个数。如果不考虑本质不同,则有树形dp。
考虑本质不同,就要考虑无根树的同构,可以用hash来搞。具体题解见:portal

我的hash真是冲突到死【再见】,hash值最好从大往小排。。。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 500010
#define mod 1000000007
#define ull unsigned long long
#define k1 11113
#define k2 11117
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}
int n,h[N],num=1,G0=0,G1=0,mn=inf,sz[N],root,a[N],f[2][N],inv[N],prod[N];
//f[0][x],以x为根的子树,不选x的本质不同独立集个数,f[1][x]--选x的个数
ull hs[N];
struct edge{int to,next;
}data[N<<1];
inline void add(int x,int y){data[++num].to=y;data[num].next=h[x];h[x]=num;
}
inline void dfs(int x,int Fa){sz[x]=1;int mx=0;for(int i=h[x];i;i=data[i].next){int y=data[i].to;if(y==Fa) continue;dfs(y,x);sz[x]+=sz[y];mx=max(mx,sz[y]);}mx=max(mx,n-sz[x]);if(mx<mn) mn=mx,G0=x,G1=0;else if(mx==mn) G1=x;
}
inline bool cmp(int a,int b){return hs[a]==hs[b]?f[0][a]<f[0][b]:hs[a]>hs[b];}
inline int C(int n,int m){int res=prod[m];for(int i=0;i<m;++i) res=(ll)res*(n-i)%mod;return res;
}
inline void dfs2(int x,int Fa){for(int i=h[x];i;i=data[i].next){int y=data[i].to;if(y==Fa) continue;dfs2(y,x);}int tot=0;for(int i=h[x];i;i=data[i].next){int y=data[i].to;if(y==Fa) continue;a[++tot]=y;}sort(a+1,a+tot+1,cmp);f[0][x]=f[1][x]=1;int j;for(int i=1;i<=tot;++i){for(j=i+1;j<=tot&&hs[a[j]]==hs[a[i]]&&f[0][a[j]]==f[0][a[i]];++j);--j;f[0][x]=(ll)f[0][x]*C(j-i+1+f[0][a[i]]+f[1][a[i]]-1,j-i+1)%mod;f[1][x]=(ll)f[1][x]*C(j-i+1+f[0][a[i]]-1,j-i+1)%mod;i=j;}hs[x]=2333;for(int i=1;i<=tot;++i) hs[x]=hs[x]*k1+hs[a[i]]*k2;
}
int main(){
//  freopen("a.in","r",stdin);n=read();inv[1]=prod[1]=1;for(int i=2;i<=n;++i) inv[i]=(ll)inv[mod%i]*(mod-mod/i)%mod;for(int i=2;i<=n;++i) prod[i]=(ll)prod[i-1]*inv[i]%mod;for(int i=1;i<n;++i){int x=read(),y=read();add(x,y);add(y,x);}dfs(1,0);if(!G1) root=G0;else{root=n+1;for(int i=h[G0];i;i=data[i].next)if(data[i].to==G1){data[i].to=data[i^1].to=root;break;}add(root,G0);add(root,G1);}dfs2(root,0);if(!G1){printf("%d\n",(f[0][root]+f[1][root])%mod);return 0;}if(hs[G0]==hs[G1]&&f[0][G0]==f[0][G1]){int x=f[0][G0];int ans=(ll)f[0][G0]*f[1][G0]%mod;ans=(ans+(ll)x*(x+1)/2)%mod;printf("%d\n",ans);return 0;}printf("%d\n",((ll)f[0][G0]*f[0][G1]+(ll)f[0][G0]*f[1][G1]+(ll)f[1][G0]*f[0][G1])%mod);return 0;
}

bzoj3162 独钓寒江雪(树形dp+Hash)相关推荐

  1. 洛谷4895 BZOJ3162 独钓寒江雪 树形dp 树哈希

    题目链接 题意: 给定一棵无根树,求其中本质不同的独立集的个数.独立集就是一个集合中的点之间都没有边直接相连.n<=5e5n<=5e5n<=5e5,对1e9+71e9+71e9+7取 ...

  2. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  3. bzoj 3162: 独钓寒江雪 树哈希+树形dp

    题意 给出一棵无标号无根树,问本质不同的最大独立集数量.答案模1e9+7. n<=500000 分析 对于一般的情况,我们可以先找出树的重心作为根,然后进行树形dp.这样做有什么好处呢?通过根的 ...

  4. codeforce708C:树形dp+二次扫描

    题目链接 题目大意: 给你一棵树,问你对于每一个点是否可以在树上删掉一条边,再增加一条边,使它成为树的重心. tips:一个点成为重心的条件为它的每个子树大小不超过n/2. 解题思路:首先树上问题一般 ...

  5. [BZOJ3197][Sdoi2013]assassin(树形DP+树同构+二分图最优匹配)

    关于树同构,有一个神奇的性质: 一棵树的重心只有 111 个或 2" role="presentation" style="position: relative ...

  6. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  7. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  8. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  9. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

最新文章

  1. 课堂练习--最大子数组和 环
  2. mysql联合子查询_2020-09-08MySQL多表联合查询之子查询
  3. 三维点云网络——PointNet论文解读
  4. 解读金融高频交易不出错的金手指:分布式事务管理
  5. 基于c语言中调试工具的用法汇总(不包含gdb)【转】
  6. vbs 窗体文字获取文档_MDI类型窗体设置背景图片
  7. 数据包络分析方法与maxdea软件_数据包络模型 DEA三阶段超效率SBM非期望
  8. 根据Debye公式计算海水介电常数及趋肤深度
  9. python实现自动开机_python自动循环定时开关机(非重启)测试
  10. 简述前端MVVM框架
  11. 数据库 - 交集、并集和补集
  12. 「NFT 之王」无聊猿与品牌的跨界营销!
  13. 资金安全责任险对个人账户负责?
  14. HIT 大物实验 数据处理代码
  15. Java —— 冒泡排序
  16. 如何修复Dns查找失败
  17. vs为什么打了断点不断_2019世界羽毛球锦标赛决赛焦点对阵:郑思维/黄雅琼VS德差波/沙西丽...
  18. 7-10 计算工资 (15 分)
  19. 计算机网络管理员工作总结计划
  20. 1040 Longest Symmetric String

热门文章

  1. 计算机教室是在音乐教室旁边吗英语,小学英语四年级下册Unit1教材同步音频+释义...
  2. 恭贺2022年下半年NPDP产品经理认证班成功举行
  3. CAS 单点登录 5.39 版本 自定义登录页面改造 响应式页面
  4. 诺威健康通过聆讯:已派付股息1570万美元,称预计将录得巨额亏损
  5. 使用LinkDevelop进行全栈开发的准备
  6. 想一直骂你看不惯的主播吗?Python实现自动发送B站直播弹幕软件
  7. 正整数的因子数和因子和
  8. poc白皮书通证经济体系_区块链中的PoC共识算法是什么意思?
  9. 软件测试人员正确分析定位BUG小技巧
  10. 华工计算机学院改分,教育部和华南理工大学通报违规更改研究生复试分数问题处理情况...