题目链接: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)相关推荐

  1. HDU - 4035 Maze(概率dp)

    题目链接:点击查看 题目大意:给出一个 n 个点的树,初始时位于点 1 ,每个点都会给出一个概率 k[ i ] 和一个概率 e[ i ] ,其代表的意义分别是: k[ i ] :在点 i 有 k[ i ...

  2. LightOJ 1395 A Dangerous Maze (II) (概率dp)

    题意:给出n扇门,每扇门都给出一个数x,若为正数,则表示在x时间后走出迷宫,若为负数,则表示在x时间后回到起点,你会记得最后k扇你走过的门(不会再走),求最后的期望时间. 题解:概率dp 这题的进阶版 ...

  3. HDU 4035 Maze

    Maze http://acm.hdu.edu.cn/showproblem.php?pid=4035 分析: 在树上走来走去,然后在一个点可以k的概率回到1,可以e的概率走出去,可以1-k-e的概率 ...

  4. 线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze

    多类型高斯消元杂题 [SDOI2010]外星千足虫 description solution code [HNOI2013]游走 description solution code [HNOI2011 ...

  5. 【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 ...

  6. HDU 2955 Robberies(概率DP,01背包)题解

    题意:给出规定的最高被抓概率m,银行数量n,然后给出每个银行被抓概率和钱,问你不超过m最多能拿多少钱 思路:一道好像能直接01背包的题,但是有些不同.按照以往的逻辑,dp[i]都是代表i代价能拿的最高 ...

  7. HDU 5378 树上的概率DP Leader in Tree Land

    官方题解: 可以用求概率的思想来解决这个问题.令以i号节点为根的子树为第i棵子树,设这颗子树恰好有sz[i]个点.那么第i个点是第i棵子树最大值的概率为1/sz[i],不是最大值的概率为(sz[i]- ...

  8. HDU 3853 LOOPS(概率DP)

    题目链接:点击打开链接 题意:求从(1, 1)点走到(n, m)点的花费能量的期望, 每次决策消耗2点能量. 每次可以原地不动或者向右或者向下, 分别有个概率. 思路:运用全概率期望公式, d[i][ ...

  9. HDU 4418 高斯消元法求概率DP

    把两种状态化成2*n-2的一条线上的一种状态即可.很容易想到. 高斯列主元法,不知为什么WA.要上课了,不玩了...逃了一次课呢.. #include <iostream> #includ ...

最新文章

  1. linux 测试环境启用jar_Linux下用java -jar运行可执行jar包的方法教程
  2. Linux命令学习之nslookup
  3. 在sublime text 3中安装中文支持
  4. Engagement Center Communication timer实现逻辑
  5. arm芯片厂家排名_国产芯片目前至少有10种,其中有3种,达到了世界顶尖水平
  6. 三校生计算机对口本科有哪些学校,宝山三校生五月对口高考报名
  7. Silverlight进度条控件动画源代码
  8. Java并发之ThreadLocal
  9. 人工神经网络算法原理和应用
  10. 剑指offer——22.链表中倒数第k个节点
  11. html 数组输入框,javascript输入数组
  12. 【perl脚本】perl one line的几个有趣实例1
  13. alin的学习之路(Qt篇:三)(常用控件,自定义控件,事件捕捉)
  14. 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(九)第一个程序背后的C语言知识
  15. 简述ip地址的abc类如何划分_ip地址的分类abc类的具体含义与分类方法
  16. Linux系统下安装redis
  17. win7 设置双屏壁纸
  18. 抽奖随机滚动_原来抽奖不是凭运气!两个技巧,让你在抽奖环节独占鳌头
  19. javax.servlet.Filter详解(二) 转自:http://hi.baidu.com/jxnuywf/blog/item/f3834aee93e2fdf8b2fb95cc.html
  20. 【Code】OJ推荐

热门文章

  1. 一场“交通进化”将至: 5G带给车联网与自动驾驶哪些升级?
  2. 工业4.0进行时:未来协作方式的变革
  3. 增强现实技术的9个最新应用趋势
  4. 揭秘|多伦多大学反人脸识别,身份欺骗成功率达99.5%
  5. 道歉无用!被 Linux “拉黑”的明尼苏达大学还在努力重获信任
  6. 腾讯 QQ 就“读取浏览器历史记录”道歉!
  7. “社区之星”成长故事征集
  8. VisualSvn Server介绍
  9. Redis架构第二天:CenterOS集群、RDB和AOF、主从复制架构实践
  10. content 内容生成技术2