BZOJ 4726 POI2017 Sabota? 树形DP
来源:互联网 发布:程序员必备刷题网站 编辑:程序博客网 时间:2024/05/27 20:51
题目大意:给出一棵
老年选手复健中……
结论1.最坏情况下初始叛徒一定是一个叶节点
证明:显然如果初始叛徒不能策反它的父亲那它就不能策反任何节点了
假设初始叛徒为
结论2.最终的所有叛徒一定是某个节点为根的子树中的所有节点
由上一个结论,显然
然后我们就可以DP了。
令
min里面的两个,一个是
答案等于
时间复杂度
带log会T。
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 500500using 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;}
1 0
- BZOJ 4726: [POI2017]Sabota?【树形dp
- BZOJ 4726 POI2017 Sabota? 树形DP
- bzoj 4726: [POI2017]Sabota? 树形dp
- [BZOJ]4726 [POI2017] Sabota? 树形Dp
- 【BZOJ】4726 [POI2017] Sabota?
- BZOJ 4726 [POI2017] Sabota?
- BZOJ4726 [POI2017][Sabota?] 树形DP
- 【BZOJ4726】【树形期望DP】[POI2017]Sabota? 题解
- [BZOJ 4726] Sabota? 树形DP+贪心思想
- 4726: [POI2017]Sabota?
- BZOJ 4726 Sabota? (树型dp)
- bzoj4726 [ POI2017 ] -- 树形DP
- BZOJ4726: [POI2017]Sabota?
- bzoj4726 [POI2017]Sabota?
- BZOJ4726 [POI2017]Sabota?
- BZOJ4726: [POI2017]Sabota?
- [bzoj4726][POI2017]Sabota?
- 【BZOJ 4726】【POI 2017】【Sabota?】
- Shell 程序设计
- 镜像劫持2
- java设计模式
- 决策树中信息增益最大找的是样本之间差异最大的特征
- 《中国当代社会各阶层分析》
- BZOJ 4726 POI2017 Sabota? 树形DP
- 自绘制Android界面核心类图
- [C++]类和对象(二)
- background-position 用法详细介绍
- 【Codeforces 237B Young Table】+ map 数组构造
- C#实现日志记录 支持按日期多文件保存
- 节日 ccf 2015年3月第3题
- oracle数据库软件安装
- Java Script