BZOJ 4726 POI2017 Sabota? 树形DP
2016-12-09 00:22
302 查看
题目大意:给出一棵n个点的有根树,初始某个点是叛徒,接下来如果某一时刻某个节点的子树除自己以外的节点中,叛徒的比例超过了x,那么这一整棵子树都会变成叛徒,求x的最小值使得最坏情况下叛徒数量不会超过k。
老年选手复健中……
结论1.最坏情况下初始叛徒一定是一个叶节点
证明:显然如果初始叛徒不能策反它的父亲那它就不能策反任何节点了
假设初始叛徒为p,p有一个儿子q,p能够策反它的父亲fap(即1size[fap]−1>x),那么显然1size[p]−1>1size[fap]−1>x,即如果把初始叛徒设为q一样能够策反fap,因此初始叛徒为q时总叛徒数不会比初始叛徒为p的时候少
结论2.最终的所有叛徒一定是某个节点为根的子树中的所有节点
由上一个结论,显然
然后我们就可以DP了。
令f[p]表示将x最小设为f[p]时节点p不会被策反,DP方程:
f[leaf]=1
f[p]=maxfaq=p{min(f[q],size[q]size[p]−1)}
min里面的两个,一个是q不被策反,另一个是即使q被策反,叛徒数量也不足够策反p,两项只要满足一个,就可以导致q无法策反p
答案等于maxsize[p]>k{f[p]}
时间复杂度O(n)
带log会T。
老年选手复健中……
结论1.最坏情况下初始叛徒一定是一个叶节点
证明:显然如果初始叛徒不能策反它的父亲那它就不能策反任何节点了
假设初始叛徒为p,p有一个儿子q,p能够策反它的父亲fap(即1size[fap]−1>x),那么显然1size[p]−1>1size[fap]−1>x,即如果把初始叛徒设为q一样能够策反fap,因此初始叛徒为q时总叛徒数不会比初始叛徒为p的时候少
结论2.最终的所有叛徒一定是某个节点为根的子树中的所有节点
由上一个结论,显然
然后我们就可以DP了。
令f[p]表示将x最小设为f[p]时节点p不会被策反,DP方程:
f[leaf]=1
f[p]=maxfaq=p{min(f[q],size[q]size[p]−1)}
min里面的两个,一个是q不被策反,另一个是即使q被策反,叛徒数量也不足够策反p,两项只要满足一个,就可以导致q无法策反p
答案等于maxsize[p]>k{f[p]}
时间复杂度O(n)
带log会T。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 500500 using namespace std; int n,m; struct abcd{ int to,next; }table[M]; int head[M],tot; int size[M]; double f[M],ans; //f[x]表示如果让以x为根的子树不叛变,答案最小多少 void Add(int x,int y) { table[++tot].to=y; table[tot].next=head[x]; head[x]=tot; } void DFS(int x) { int i; size[x]=1; for(i=head[x];i;i=table[i].next) { DFS(table[i].to); size[x]+=size[table[i].to]; } } void Tree_DP(int x) { int i; if(!head[x]) { f[x]=1; return ; } for(i=head[x];i;i=table[i].next) { Tree_DP(table[i].to); f[x]=max(f[x],min(f[table[i].to],(double)size[table[i].to]/(size[x]-1) )); } if(size[x]>m) ans=max(ans,f[x]); } int main() { cin>>n>>m; for(int x,i=2;i<=n;i++) { scanf("%d",&x); Add(x,i); } DFS(1); Tree_DP(1); printf("%.10lf\n",ans); return 0; }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- jsp利用POI生成Excel并在页面中导出的示例
- C#使用动态规划解决0-1背包问题实例分析
- Android SDK 百度地图通过poi城市内检索简介接口的使用
- Android实现带列表的地图POI周边搜索功能
- Android百度地图poi范围搜索
- Android 百度地图POI搜索功能实例代码
- Java利用POI实现导入导出Excel表格示例代码
- Java使用poi操作excel实例解析
- POI对Excel自定义日期格式的读取(实例代码)
- Java 使用poi把数据库中数据导入Excel的解决方法
- java的poi技术读取和导入Excel实例
- java POI解析Excel 之数据转换公用方法(推荐)
- java使用POI读取properties文件并写到Excel的方法
- java使用poi读取ppt文件和poi读取excel、word示例
- Java中使用Apache POI读取word文件简单示例
- POI WORD