HDU 4035 Maze(树形概率DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035
题意:一棵树,从结点1出发,在每个结点 i 都有3种可能:(1)回到结点1 , 概率 Ki;(2)结束,概率 Ei;(3)随机走一条边。(ki+ei+随机走=1) 求到结束需要走的边数的期望。
假设E[i]为点i到结束走边数的期望,则有
(以下m为点的度数)
E[i]=ki*E[1]+(1-ei-ki)/m*(E[fa[i]]+1)若i为叶子节点.
=ki*E(1)+(1-ki-ei)*E(father)+(1-ki-ei)
E[i]=ki*E[1]+(1-ei-ki)/m*(E[fa[i]]+1)+(1-ei-ki)/m*(Sum(E[son[i]]+1))i不为叶子节点
=ki*E(1)+(1-ki-ei)/m *E(father)+(1-ki-ei)/m*SUM(E(child))+(1-ki-ei) 作为1式
我们发现,这样求非常麻烦,若是n小一点大可用高斯消元求解,可这题的n为10000,无法用高斯消元。
对于每个E[i],我们令E[i]=Ai*(E[1])+Bi*(E[fa[i]])+Ci
E[child]=Aj*E[1]+Bj*E[i]+Cj
Sum(E[child])=Sum(Aj*E[1]+Bj*E[i]+Cj)
带入1式:ki*E(1)+(1-ki-ei)/m *E(father)+(1-ki-ei)/m*Sum(Aj*E[1]+Bj*E[i]+Cj)+(1-ki-ei)
可得:(ki+(1-ki-ei)/m*SUM(Aj))*E(1)+(1-ki-ei)/m *E(father)+(1-ki-ei+(1-ki-ei)/m*SUM(cj))
与刚才的E[i]=Ai*(E[1])+Bi*(E[fa[i]])+Ci对比一下发现:
Ai=(ki+(1-ki-ei)/m*SUM(Aj))
Bi=(1-ki-ei)/m
Ci=(1-ki-ei+(1-ki-ei)/m*SUM(cj))
对于叶子节点,有
Ai=ki
Bi=1-ki-ei
Ci=1-ki-ei
倒推即可,还有,
E(1)=A1*E(1)+B1*0+C1
E(1)=C1/(1-A1)
若是上述式子中的分母出现0则无解。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cmath> 5 #include<algorithm> 6 const double eps=1e-9; 7 int tot,go[500005],first[500005],next[500005]; 8 double a[500005],b[500005],c[500005],k[500005],e[500005]; 9 int n,du[500005]; 10 void insert(int x,int y){tot++;go[tot]=y;next[tot]=first[x];first[x]=tot;} 11 void add(int x,int y){insert(x,y);insert(y,x);} 12 bool dfs(int x,int fa){ 13 bool Isleave=1; 14 double tmp=0; 15 a[x]=k[x]; 16 b[x]=c[x]=(1-k[x]-e[x]); 17 b[x]/=du[x]; 18 for (int i=first[x];i;i=next[i]){ 19 int pur=go[i]; 20 if (pur==fa) continue; 21 Isleave=0; 22 if (!dfs(pur,x)) return false; 23 a[x]+=a[pur]*(1-k[x]-e[x])/du[x]; 24 c[x]+=c[pur]*(1-k[x]-e[x])/du[x]; 25 tmp+=(b[pur])*(1-k[x]-e[x])/du[x]; 26 } 27 if (fabs(tmp-1)<=eps) return false; 28 a[x]/=(1-tmp); 29 b[x]/=(1-tmp); 30 c[x]/=(1-tmp); 31 return true; 32 } 33 int main(){ 34 int T,Tcase=0; 35 scanf("%d",&T); 36 while (T--){ 37 Tcase++; 38 tot=0; 39 memset(first,0,sizeof first); 40 memset(du,0,sizeof du); 41 scanf("%d",&n); 42 for (int i=1;i<n;i++){ 43 int x,y; 44 scanf("%d%d",&x,&y); 45 add(x,y); 46 du[x]++; 47 du[y]++; 48 } 49 for (int i=1;i<=n;i++){ 50 scanf("%lf%lf",&k[i],&e[i]); 51 k[i]/=100;e[i]/=100; 52 } 53 printf("Case %d: ",Tcase); 54 if (dfs(1,0)&&fabs(1-a[1])>eps){ 55 printf("%.6f\n",c[1]/(1-a[1])); 56 } 57 else{ 58 printf("impossible\n"); 59 } 60 } 61 }
转载于:https://www.cnblogs.com/qzqzgfy/p/5543901.html
HDU 4035 Maze(树形概率DP)相关推荐
- HDU - 4035 Maze(概率dp)
题目链接:点击查看 题目大意:给出一个 n 个点的树,初始时位于点 1 ,每个点都会给出一个概率 k[ i ] 和一个概率 e[ i ] ,其代表的意义分别是: k[ i ] :在点 i 有 k[ i ...
- LightOJ 1395 A Dangerous Maze (II) (概率dp)
题意:给出n扇门,每扇门都给出一个数x,若为正数,则表示在x时间后走出迷宫,若为负数,则表示在x时间后回到起点,你会记得最后k扇你走过的门(不会再走),求最后的期望时间. 题解:概率dp 这题的进阶版 ...
- HDU 4035 Maze
Maze http://acm.hdu.edu.cn/showproblem.php?pid=4035 分析: 在树上走来走去,然后在一个点可以k的概率回到1,可以e的概率走出去,可以1-k-e的概率 ...
- 线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze
多类型高斯消元杂题 [SDOI2010]外星千足虫 description solution code [HNOI2013]游走 description solution code [HNOI2011 ...
- 【LightOJ - 1027】A Dangerous Maze(概率dp,数学期望)
题干: You are in a maze; seeing n doors in front of you in beginning. You can choose any door you like ...
- HDU 2955 Robberies(概率DP,01背包)题解
题意:给出规定的最高被抓概率m,银行数量n,然后给出每个银行被抓概率和钱,问你不超过m最多能拿多少钱 思路:一道好像能直接01背包的题,但是有些不同.按照以往的逻辑,dp[i]都是代表i代价能拿的最高 ...
- HDU 5378 树上的概率DP Leader in Tree Land
官方题解: 可以用求概率的思想来解决这个问题.令以i号节点为根的子树为第i棵子树,设这颗子树恰好有sz[i]个点.那么第i个点是第i棵子树最大值的概率为1/sz[i],不是最大值的概率为(sz[i]- ...
- HDU 3853 LOOPS(概率DP)
题目链接:点击打开链接 题意:求从(1, 1)点走到(n, m)点的花费能量的期望, 每次决策消耗2点能量. 每次可以原地不动或者向右或者向下, 分别有个概率. 思路:运用全概率期望公式, d[i][ ...
- HDU 4418 高斯消元法求概率DP
把两种状态化成2*n-2的一条线上的一种状态即可.很容易想到. 高斯列主元法,不知为什么WA.要上课了,不玩了...逃了一次课呢.. #include <iostream> #includ ...
最新文章
- linux 测试环境启用jar_Linux下用java -jar运行可执行jar包的方法教程
- Linux命令学习之nslookup
- 在sublime text 3中安装中文支持
- Engagement Center Communication timer实现逻辑
- arm芯片厂家排名_国产芯片目前至少有10种,其中有3种,达到了世界顶尖水平
- 三校生计算机对口本科有哪些学校,宝山三校生五月对口高考报名
- Silverlight进度条控件动画源代码
- Java并发之ThreadLocal
- 人工神经网络算法原理和应用
- 剑指offer——22.链表中倒数第k个节点
- html 数组输入框,javascript输入数组
- 【perl脚本】perl one line的几个有趣实例1
- alin的学习之路(Qt篇:三)(常用控件,自定义控件,事件捕捉)
- 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(九)第一个程序背后的C语言知识
- 简述ip地址的abc类如何划分_ip地址的分类abc类的具体含义与分类方法
- Linux系统下安装redis
- win7 设置双屏壁纸
- 抽奖随机滚动_原来抽奖不是凭运气!两个技巧,让你在抽奖环节独占鳌头
- javax.servlet.Filter详解(二) 转自:http://hi.baidu.com/jxnuywf/blog/item/f3834aee93e2fdf8b2fb95cc.html
- 【Code】OJ推荐
热门文章
- 一场“交通进化”将至: 5G带给车联网与自动驾驶哪些升级?
- 工业4.0进行时:未来协作方式的变革
- 增强现实技术的9个最新应用趋势
- 揭秘|多伦多大学反人脸识别,身份欺骗成功率达99.5%
- 道歉无用!被 Linux “拉黑”的明尼苏达大学还在努力重获信任
- 腾讯 QQ 就“读取浏览器历史记录”道歉!
- “社区之星”成长故事征集
- VisualSvn Server介绍
- Redis架构第二天:CenterOS集群、RDB和AOF、主从复制架构实践
- content 内容生成技术2