1. dp求期望的题。
  2. 题意:
  3. n个房间,由n-1条隧道连通起来,实际上就形成了一棵树,
  4. 从结点1出发,开始走,在每个结点i都有3种可能:
  5. 1.被杀死,回到结点1处(概率为ki
  6. 2.找到出口,走出迷宫 (概率为ei
  7. 3.和该点相连有m条边,随机走一条
  8. 求:走出迷宫所要走的边数的期望值。
  9.  
  10. E[i]表示在结点i处,要走出迷宫所要走的边数的期望。E[1]即为所求。
  11.  
  12. 叶子结点:
  13. E[i] = ki*E[1] + ei*0 + (1-ki-ei)*(E[father[i]] + 1);//因为是到达,i点跑出去的期望步数,所以逃出去的那个概率应该乘以0
  14. = ki*E[1] + (1-ki-ei)*E[father[i]] + (1-ki-ei);
  15.  
  16. 非叶子结点:(m为与结点相连的边数)
  17. E[i] = ki*E[1] + ei*0 + (1-ki-ei)/m*( E[father[i]]+1 + ∑( E[child[i]]+1 ) );
  18. = ki*E[1] + (1-ki-ei)/m*E[father[i]] + (1-ki-ei)/m*∑(E[child[i]]) + (1-ki-ei);
  19.  
  20. 设对每个结点:E[i] = Ai*E[1] + Bi*E[father[i]] + Ci;
  21.  
  22. 对于非叶子结点i,设ji的孩子结点,则
  23. ∑(E[child[i]]) = E[j]
  24. = ∑(Aj*E[1] + Bj*E[father[j]] + Cj)
  25. = ∑(Aj*E[1] + Bj*E[i] + Cj)
  26. 带入上面的式子得
  27. (1 - (1-ki-ei)/m*∑Bj)*E[i] = (ki+(1-ki-ei)/m*∑Aj)*E[1] + (1-ki-ei)/m*E[father[i]] + (1-ki-ei) + (1-ki-ei)/m*∑Cj;
  28. 由此可得
  29. Ai = (ki+(1-ki-ei)/m*∑Aj) / (1 - (1-ki-ei)/m*∑Bj);
  30. Bi = (1-ki-ei)/m / (1 - (1-ki-ei)/m*∑Bj);
  31. Ci = ( (1-ki-ei)+(1-ki-ei)/m*∑Cj ) / (1 - (1-ki-ei)/m*∑Bj);
  32.  
  33. 对于叶子结点
  34. Ai = ki;
  35. Bi = 1 - ki - ei;
  36. Ci = 1 - ki - ei;
  37.  
  38. 从叶子结点开始,直到算出 A1,B1,C1;
  39.  
  40. E[1] = A1*E[1] + B1*0 + C1;
  41. 所以
  42. E[1] = C1 / (1 - A1);
  43. A1趋近于1则无解...
    上面这一问题,中发现E[1]消不去,然后就用算出A,B,C的方式来求解。
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<iostream>
  5. #include<cmath>
  6. #include<vector>
  7. using namespace std;
  8. const int MAXN=;
  9. const double eps=1e-;//这里1e-8会WA。设为1e-9和1e-10可以
  10. double k[MAXN],e[MAXN];
  11. double A[MAXN],B[MAXN],C[MAXN];
  12.  
  13. int T,n,u,v,iCase;
  14. vector<int>vec[MAXN];//存树
  15.  
  16. bool dfs(int t,int pre)//t的根结点是pre
  17. {
  18. int m=vec[t].size();//点t的度
  19. A[t]=k[t];
  20. B[t]=(-k[t]-e[t])/m;
  21. C[t]=-k[t]-e[t];
  22. double tmp=;
  23. for(int i=;i<m;i++)
  24. {
  25. int v=vec[t][i];
  26. if(v==pre)continue;
  27. if(!dfs(v,t))return false;
  28. A[t]+=(-k[t]-e[t])/m*A[v];
  29. C[t]+=(-k[t]-e[t])/m*C[v];
  30. tmp+=(-k[t]-e[t])/m*B[v];
  31. }
  32. if(fabs(tmp-)<eps)return false;
  33. A[t]/=(-tmp);
  34. B[t]/=(-tmp);
  35. C[t]/=(-tmp);
  36. return true;
  37. }
  38. int main()
  39. {
  40. scanf("%d",&T);
  41. while(T--)
  42. {
  43. iCase++;
  44. scanf("%d",&n);
  45. for(int i=;i<=n;i++)vec[i].clear();
  46. for(int i=;i<n;i++)
  47. {
  48. scanf("%d%d",&u,&v);
  49. vec[u].push_back(v);
  50. vec[v].push_back(u);
  51. }
  52. for(int i=;i<=n;i++)
  53. {
  54. scanf("%lf%lf",&k[i],&e[i]);
  55. k[i]/=;
  56. e[i]/=;
  57. }
  58. printf("Case %d: ",iCase);
  59. if(dfs(,-)&&fabs(-A[])>eps)
  60. {
  61. printf("%.6lf\n",C[]/(-A[]));
  62. }
  63. else printf("impossible\n");
  64. }
  65. }
  1.  

hdu4035 Maze (树上dp求期望)的更多相关文章

  1. HDU3853-LOOPS(概率DP求期望)

    LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Su ...

  2. Poj 2096 (dp求期望 入门)

    / dp求期望的题. 题意:一个软件有s个子系统,会产生n种bug. 某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中. 求找到所有的n种bug,且每个子系统都找到bug,这样所要 ...

  3. POJ2096 Collecting Bugs(概率DP,求期望)

    Collecting Bugs Ivan is fond of collecting. Unlike other people who collect post stamps, coins or ot ...

  4. POJ 2096 (dp求期望)

    A - Collecting Bugs Time Limit:10000MS     Memory Limit:64000KB     64bit IO Format:%I64d & %I64 ...

  5. HDU4035 Maze (概率DP)

    转:https://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, ...

  6. HDU-4035 Maze (概率DP求期望)

    题目大意:在一个树形迷宫中,以房间为节点.有n间房间,每间房间存在陷阱的概率为ki,存在出口的概率为ei,如果这两种情况都不存在(概率为pi),那么只能做出选择走向下一个房间(包括可能会走向上一个房间 ...

  7. loj 1038(dp求期望)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25915 题意:求一个数不断地除以他的因子,直到变成1的时候 除的次 ...

  8. HDU-3853 LOOPS(概率DP求期望)

    题目大意:在nxm的方格中,从(1,1)走到(n,m).每次只能在原地不动.向右走一格.向下走一格,概率分别为p1(i,j),p2(i,j),p3(i,j).求行走次数的期望. 题目分析:状态转移方程 ...

  9. HDU-4405 Aeroplane chess(概率DP求期望)

    题目大意:一个跳棋游戏,每置一次骰子前进相应的步数.但是有的点可以不用置骰子直接前进,求置骰子次数的平均值. 题目分析:状态很容易定义:dp(i)表示在第 i 个点出发需要置骰子的次数平均值.则状态转 ...

随机推荐

  1. MySQL常用命令和语句

    1.常用SQL语句 1)常用函数/*type可取值为:MICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEARSECOND_MICROSECONDMINUT ...

  2. Python 学习日志9月20日

    9月20日 周三 多大年龄了,还活得像个小孩.——急什么,人生又不长. 你习惯了思考宇宙星辰,一百年真的不长,一生也就不那么长,许多人的价值观念你也就无法理解.同样,许多人也无法理解你的价值观念,感兴 ...

  3. Codeforces Round #318 (Div. 2) B Bear and Three Musketeers (暴力)

    算一下复杂度.发现可以直接暴.对于u枚举a和b,判断一下是否连边,更新答案. #include<bits/stdc++.h> using namespace std; int n,m; ; ...

  4. UVA 1151 Buy or Build (最小生成树)

    先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点.正确性是基于一个贪心, 在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少. ...

  5. pb2.text_format.Merge(f.read(), self.solver_param) AttributeError: 'module' object has no attribute 'text_format'

    http://blog.csdn.net/qq_33202928/article/details/72526710

  6. 【转载】WPF DataGrid 性能加载大数据

    作者:过客非归 来源:CSDN 原文:https://blog.csdn.net/u010265681/article/details/76651725 WPF(Windows Presentatio ...

  7. 用border实现三角形的过程

    div{ width:100px; height:100px; background:yellow; border-top: 20px solid red; border-right:20px sol ...

  8. 7.逻辑运算 and or not

    1)优先级 ()> not  > and > o r and:真真为真,真假为假 ,假假为假 or:真真为真,真假为真,假假为假 print(2 > 1 and 1 < ...

  9. fossil 代理设置

    C:\>fossil user new Joe C:\>fossil user default Joe 设置账户 fossil setting proxy http://-:-fossil ...

  10. html中注释的问题

    在修改jsp页面的时候遇到了一个有点难懂的注释,mark一下 <script> <!-- alert("js code"); //--> </scri ...