题意

抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html

有n个房间,由n-1条隧道连通起来,形成一棵树,从结点1出发,开始走,在每个结点i都有3种可能(概率之和为1):1.被杀死,回到结点1处(概率为ki)2.找到出口,走出迷宫 (概率为ei)
3.和该点相连有m条边,随机走一条求:走出迷宫所要走的边数的期望值。(2≤n≤10000)

Sol

非常nice的一道题。

我简单的说一下思路:首先列出方程,$f[i]$表示在第$i$个位置走出迷宫的期望步数。

转移方程分叶子节点和父亲节点讨论一下,发现都可以化成$f[x] = a f[1] + b f[fa] + c$的形式

然后直接递推系数即可

具体可以看https://www.cnblogs.com/Paul-Guderian/p/7624039.html

  1. /*
  2.  
  3. */
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<map>
  8. #include<vector>
  9. #include<set>
  10. #include<queue>
  11. #include<cmath>
  12. #define Pair pair<int, int>
  13. #define MP(x, y) make_pair(x, y)
  14. #define fi first
  15. #define se second
  16. //#define int long long
  17. //#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<22, stdin), p1 == p2) ? EOF : *p1++)
  18. //char buf[(1 << 22)], *p1 = buf, *p2 = buf;
  19. using namespace std;
  20. const int MAXN = 1e5 + , INF = 1e9 + ;
  21. const double eps = 1e-;
  22. inline int read() {
  23. char c = getchar(); int x = , f = ;
  24. while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
  25. while(c >= '' && c <= '') x = x * + c - '', c = getchar();
  26. return x * f;
  27. }
  28. int N;
  29. vector<int> v[MAXN];
  30. double b[MAXN], e[MAXN], A[MAXN], B[MAXN], C[MAXN];
  31. bool dcmp(double x) {
  32. if(fabs(x) < eps) return ;
  33. else return ;
  34. }
  35. void init() {
  36. for(int i = ; i <= N; i++) v[i].clear();
  37. }
  38. double Get(int x) {
  39. return ( - b[x] - e[x]) / (v[x].size());
  40. }
  41. bool dfs(int x, int fa) {
  42. if(v[x].size() == && (v[x][] == fa)) {A[x] = b[x], C[x] = B[x] = Get(x); return ;}
  43. double As = , Bs = , Cs = ;
  44. for(int i = ; i < v[x].size(); i++) {
  45. int to = v[x][i];
  46. if(to == fa) continue;
  47. if(!dfs(to, x)) return ;
  48. As += A[to]; Bs += B[to]; Cs += C[to] + ;
  49. }
  50. double P = Get(x);
  51. double D = ( - Bs * P);
  52. if(!dcmp(D)) return ;
  53. A[x] = (b[x] + As * P) / D;
  54. B[x] = P / D;
  55. C[x] = (Cs * P + ((x == ) ? : P)) / D;
  56. return ;
  57. }
  58. int main() {
  59. int T = read();
  60. for(int GG = ; GG <= T; GG++) {
  61. N = read(); init();
  62. //printf("%d ", v[3].size());
  63. for(int i = ; i <= N - ; i++) {
  64. int x = read(), y = read();
  65. v[x].push_back(y); v[y].push_back(x);
  66. }
  67. for(int i = ; i <= N; i++) b[i] = (double) read() / , e[i] = (double) read() / ;
  68. if(dfs(, ) && (dcmp( - A[]))) printf("Case %d: %.10lf\n", GG, C[] / ( - A[]));
  69. else printf("Case %d: impossible\n", GG);
  70. }
  71. return ;
  72. }
  73. /*
  74.  
  75. */

HDU4035 Maze(期望DP)的更多相关文章

  1. HDU4035 Maze 期望DP+树形DP(好题)

    题意:有一个树形的迷宫,有N个房间(标号为1~N)以及N-1条通道将它们连通,一开始在1号房间,每进入一个房间i,有k[i]的概率被陷阱杀死回到房间1,有s[i]的概率找到出口逃离迷宫,如果没有找到出 ...

  2. hdu4035 Maze (树上dp求期望)

    dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 ...

  3. poj 2096 Collecting Bugs && ZOJ 3329 One Person Game && hdu 4035 Maze——期望DP

    poj 2096 题目:http://poj.org/problem?id=2096 f[ i ][ j ] 表示收集了 i 个 n 的那个. j 个 s 的那个的期望步数. #include< ...

  4. HDU4035 Maze (概率DP)

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

  5. HDU.4035.Maze(期望DP)

    题目链接 (直接)设\(F(i)\)为在\(i\)点走出迷宫的期望步数.答案就是\(F(1)\). 令\(p_i=1-k_i-e_i\),表示\(i\)点沿着边走的概率:\(d_i=dgr[i]\), ...

  6. HDU4035 Maze(师傅逃亡系列•二)(循环型 经典的数学期望)

    When wake up, lxhgww find himself in a huge maze. The maze consisted by N rooms and tunnels connecti ...

  7. 概率期望dp

    对于概率dp,我一直都弄得不是特别明白,虽然以前也有为了考试去突击过,但是终究还是掌握得不是很好,所以决定再去学习一遍,把重要的东西记录下来. 1.hdu4405 Description 在一个 \( ...

  8. hdu4035 Maze

    题目链接 hdu4035 Maze 题解 f[u]表示在节点u通关的所需的边数期望 转移方程分叶子节点和非叶子点讨论 发现都可以化成f[x]=af[1]+bf[dad]+c的形式 然后推一下系数 还是 ...

  9. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

随机推荐

  1. MySQL源码学习——DBUG调试

    一.前言 在规模稍微大点的项目中,为了方便快速找到bug的所在,我们往往需要在代码中加入一些调试用的代码,比如加入一些printf,打印出一些重点的信息:加入assert,进行断言判断.这些比较随意的 ...

  2. PYTHON 异常处理 一 ASSERT

    assert语句,如果没记错,这个东西在C或者C++里面也有的.属于短小的断言.下面的是来自python help document的说明: Assert statements are a conve ...

  3. 解除win10禁ping方法

    在局域网中,有一台电脑安装了win10操作系统,win10电脑连接网络没有问题,就是在其他电脑ping这台windows10电脑时就是ping不通,显示“请求超时.”.虽然这台windows10电脑联 ...

  4. java中有关socket通信的学习笔记

    最近做的项目中使用到了一些基于java的socket长连接的一些功能,用来穿透有关行业的网闸.用到了也就学习了一下,下面是对学习内容的一个笔记,记录一下也希望有兴趣的同学可以参考一下,加深对javas ...

  5. dockerfile:制作tomcat镜像+javaweb

    FROM ubuntu:14.10 MAINTAINER linx #把java与tomcat添加到容器中,Add会解压 ADD jdk-8u151-linux-x64.tar.gz /usr/loc ...

  6. 玲珑OJ1088【蜜汁尺取】

    前言(膜法): 早上10点多开始膜的,然后到中午交了一发,感觉膜法不对啊!然后就兴起小窗了一发管理员,然后管理员给我发了in,out数据...可是太大并没有什么可取性... 还是自己试,然后发现自己搞 ...

  7. bzoj 4873: [Shoi2017]寿司餐厅【最大权闭合子图】

    有正负收益,考虑最小割 因为有依赖关系,所以考虑最大权闭合子图 首先对每个d[i][j]建个点,正权连(s,id[i][j],d[i][j])并加到ans上,负权连(id[i][j],t,-d[i][ ...

  8. [Xcode 实际操作]二、视图与手势-(8)UIView视图的纹理填充

    目录:[Swift]Xcode实际操作 本文将演示将导入的图片作为纹理,平铺整个屏幕. 往项目中导入一张图片. 点击底部左下角的图标->[Import]->选择需要导入的图片->[O ...

  9. nil 与 release

    nil就是把一个对象的指针置为空,只是切断了指针与内存中对象的联系:而release才是真正通知内存释放这个对象. 如果没有release就直接nil,那么虽然不会出错,却等于自己制造内存泄漏了,因为 ...

  10. 分布式通信-tcp/ip socket

    Socket通讯的过程 Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受) ...