题意:给一棵有根树,从根节点深搜,每次随机走,问每个点的dfs序的期望是多少

分析:对于每一个点,它的所有祖先节点dfs序肯定在它之前,它所在的子树的节点一定在它后面,

剩下的是既不是子树又不是祖先的节点,可能在它之前,也可能在以后,这里面每个点在它之前的概率为0.5

也就是针对当前点,课变序列式呈对称态势的,所以最终期望是在中间

即:ret[u]=(n-son[u]-ancestor[u])/2+depth[u];这里的son[u]包括u

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
typedef long long LL;
const int N = 1e5+;
const int INF = 0x3f3f3f3f;
const LL mod = 1e9+;
typedef pair<int ,int >pii;
struct Edge{
int v,next;
}edge[N<<];
int head[N],tot,n,dep[N],son[N];
void add(int u,int v){
edge[tot].v=v;
edge[tot].next=head[u];
head[u]=tot++;
}
double ret[N];
void dfs(int u,int f){
son[u]=;dep[u]=dep[f]+;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].v;
dfs(v,u);
son[u]+=son[v];
}
ret[u]=1.0*(n-dep[u]+-son[u])/2.0+dep[u];
}
int main(){
scanf("%d",&n);
memset(head,-,sizeof(head));
for(int i=;i<=n;++i){
int u;scanf("%d",&u);
add(u,i);
}
dfs(,);
for(int i=;i<n;++i)
printf("%.1f ",ret[i]);
printf("%.1f\n",ret[n]);
return ;
}

最新文章

  1. js获取可视区域高度
  2. ie8下使用knockoutjs遇到的一个模板异常
  3. SVN常见图标的含义
  4. mysql支持跨表delete删除多表记录
  5. ZK dropEvent简单使用
  6. Ubuntu下装QQ2014
  7. //四舍五入//得到倒序//比较字符串//拦截时间,实现超时锁屏//判断是否越狱//配置PodFile//Storyboard中跳转操作//处理不可逆的push界面操作
  8. UVa 11729 Commando War 突击战
  9. Java Stream 使用详解
  10. prototype/constructor/__proto__之constructor。
  11. NVL NVL2 NVLIF
  12. python copy模块
  13. 使用System.out.printf()输出日志重定向到文件后显示混乱问题
  14. 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)
  15. Linux 题目收集
  16. PHP: Short URL Algorithm Implementation
  17. type Props={};
  18. webpack libray 参考例子
  19. Android图片二级缓存
  20. 使用MDI窗体实现多窗口效果

热门文章

  1. REST_FRAMEWORK加深记忆-第二次练习官方文档2
  2. hdu 1812 Count the Tetris
  3. I&#178;C接口学习总结
  4. VA对于开发QT是神器
  5. BCB一个问过100遍啊100遍的问题
  6. OSSEC配置文件ossec.conf中添加mysql服务
  7. android休眠唤醒流程2
  8. [置顶] android 与JavaScript的互相调用
  9. WIN7 64位系统搭建WINCE6.0系统遇到的问题
  10. NuGet学习笔记