题目链接

BZOJ4035

题解

神题啊。。。orz
不过网上题解好难看,数学推导不写\(Latex\)怎么看。。【Latex中毒晚期

我们由题当然能很快写出\(dp\)方程
设\(f[i]\)表示从\(u\)出发逃离的期望步数,\(m\)为该点度数
\[ \begin{aligned} f[u] &= K_uf[1] + \frac{1 - K_u - E_u}{m}\sum\limits_{(u,v) \in edge} (f[v] + 1)\\ &= K_uf[1] + \frac{1 - K_u - E_u}{m}f[fa[u]] + \frac{1 - K_u - E_u}{m}\sum\limits_{(u,v) \in edge \& v \ne fa[u]} f[v] + (1 - K_u - E_u)\\ \end{aligned} \]
然后就会发现这个方程似乎有后效性,立即想高斯消元
一看范围\(n \le 10^4\)什么鬼嘛QAQ。。。

题解是这么说的:
我们设
\[f[u] = A_uf[1] + B_uf[fa[u]] + C_u\]
对于叶子节点,显然有
\[ \begin{aligned} A_u &= K_u \\ B_u &= 1 - K_u - E_u \\ C_u &= 1 - K_u - E_u \\ \end{aligned} \]
对于非叶节点,我们展开\(f[v]\)
\[ \begin{aligned} f[u] &= K_uf[1] + \frac{1 - K_u - E_u}{m}f[fa[u]] + \frac{1 - K_u - E_u}{m}\sum\limits_{(u,v) \in edge \& v \ne fa[u]} f[v] + (1 - K_u - E_u)\\ &= K_uf[1] + \frac{1 - K_u - E_u}{m}f[fa[u]] + \frac{1 - K_u - E_u}{m}\sum\limits_{(u,v) \in edge \& v \ne fa[u]} (A_vf[1] + B_vf[u] + C_v) + (1 - K_u - E_u)\\ \end{aligned} \]

我们整理一下:
\[f[u] = \frac{K_u + \frac{1 - K_u - E_u}{m}\sum A_v}{1 - \frac{1 - K_u - E_u}{m}\sum B_v}f[1] + \frac{\frac{1 - K_u - E_u}{m}}{1 - \frac{1 - K_u - E_u}{m}\sum B_v}f[fa[u]] + \frac{1 - K_u - E_u - \frac{1 - K_u - E_u}{m}\sum C_v}{1 - \frac{1 - K_u - E_u}{m}\sum B_v}\]

\[ \begin{aligned} A_u &= \frac{K_u + \frac{1 - K_u - E_u}{m}\sum A_v}{1 - \frac{1 - K_u - E_u}{m}\sum B_v} \\ B_u &= \frac{\frac{1 - K_u - E_u}{m}}{1 - \frac{1 - K_u - E_u}{m}\sum B_v} \\ C_u &= \frac{1 - K_u - E_u - \frac{1 - K_u - E_u}{m}\sum C_v}{1 - \frac{1 - K_u - E_u}{m}\sum B_v} \\ \end{aligned} \]
然后由于
\[ \begin{aligned} f[1] &= A_1f[1] + B_1 \times 0 + C_1 \\ f[1] &= \frac{C_1}{1 - A_1} \end{aligned} \]
当\(1 - A_1 = 0\)时无解
否则我们能直接计算出\(f[1]\),即为所求

是不是很神奇?
这个式子的推导主要是利用了式子中有\(f[fa[u]]\)这一项,从而可以从儿子中递推出父亲的信息

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define mp(a,b) make_pair<int,int>(a,b)
#define cls(s) memset(s,0,sizeof(s))
#define cp pair<int,int>
#define LL long long int
#define eps 1e-10
using namespace std;
const int maxn = 10005,maxm = 100005,INF = 1000000000;
inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag;
}
int n,h[maxn],ne,de[maxn],fa[maxn];
struct EDGE{int to,nxt;}ed[maxn << 1];
void build(int u,int v){ed[++ne] = (EDGE){v,h[u]}; h[u] = ne;ed[++ne] = (EDGE){u,h[v]}; h[v] = ne;de[u]++; de[v]++;
}
double A[maxn],B[maxn],C[maxn],K[maxn],E[maxn];
int dfs(int u){if (de[u] == 1 && u != 1){A[u] = K[u];B[u] = C[u] = 1 - K[u] - E[u];return true;}double m = de[u],tmp = 0;A[u] = K[u];B[u] = (1 - K[u] - E[u]) / m;C[u] = 1 - K[u] - E[u];Redge(u) if ((to = ed[k].to) != fa[u]){fa[to] = u; if (!dfs(to)) return false;A[u] += A[to] * B[u];C[u] += C[to] * B[u];tmp += B[to] * B[u];}if (fabs(1 - tmp) < eps) return false;A[u] /= (1 - tmp); B[u] /= (1 - tmp); C[u] /= (1 - tmp);return true;
}
int main(){int T = read();for (int t = 1; t <= T; t++){n = read(); cls(de); cls(h); ne = 1;for (int i = 1; i < n; i++) build(read(),read());for (int i = 1; i <= n; i++) K[i] = read() / 100.0,E[i] = read() / 100.0;printf("Case %d: ",t);if (!dfs(1) || fabs(A[1] - 1) < eps) puts("impossible");else printf("%.10lf\n",C[1] / (1 - A[1]));}return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/9077231.html

hdu4035 Maze 【期望dp + 数学】相关推荐

  1. HDU-4035 Maze 概率DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 很不错的概率DP题目,因为这题是无向图,所以要对叶节点和非叶节点考虑,然后列出方程后,因为数据很 ...

  2. 插头DP 概率DP / 期望DP

    插头DP && 概率DP / 期望DP 写在前面: 插头DP P5056 [模板]插头dp 手写哈希表的方法: 拉链法的代码如下: 开放寻址法的代码如下: 接下来是这道题的代码实现: ...

  3. WJMZBMR打osu! / Easy【期望dp】

    >Link luogu P1365 >Description 有一个长度为 n 的仅由ooo,xxx,???三个字符组成的字符串 设字符串的分数为:其中长度为 aaa 的只包含 ooo 的 ...

  4. luogu P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4745 [CERC2017]Gambling Guide(期望DP + 最短路实现) Weblin ...

  5. [SCOI2008]奖励关(期望dp)

    你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...

  6. 【bzoj4318】OSU! 期望dp

    题目描述 osu 是一款群众喜闻乐见的休闲软件.  我们可以把osu的规则简化与改编成以下的样子:  一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的0 ...

  7. 【loj6342】跳一跳 期望dp

    题目描述 一个人从 $1$ 开始向 $n$ 跳,在 $i$ 时会等概率跳到 $i,i+1,...,n$ 之一.求从 $1$ 跳到 $n$ 的期望步数. $n\le 10^7$ . 题解 期望dp傻逼题 ...

  8. 【高斯消元】兼 【期望dp】例题

    [总览] 高斯消元基本思想是将方程式的系数和常数化为矩阵,通过将矩阵通过行变换成为阶梯状(三角形),然后从小往上逐一求解. 如:$3X_1 + 2X_2 + 1X_3 = 3$ $           ...

  9. Luogu P3251 [JLOI2012]时间流逝 期望dp

    题面 题面 题解 期望\(dp\)好题! 今年\(ZJOI\)有讲过这题... 首先因为\(T\)只有\(50\),大力\(dfs\)后发现,可能的状态数最多只有\(20w\)左右,所以我们就可以大力 ...

最新文章

  1. java培训:Java的十大算法
  2. C 预处理器 —— __DATE__ # __TIME__ # __FILE__ # __LINE__ # __STDC__ (预处理宏的使用 —— 打印debug信息:)
  3. 在你的计算机上使用qr码登录,如何在Android 10上使用QR码共享您的Wi-fi凭据 | MOS86...
  4. C#获取文件夹下的所有文件的文件名
  5. 记录一次查询log的经历
  6. 创建IE各版本专属CSS
  7. android studio导入eclipse项目各种问题,Android | 导入Eclipse项目到Android studio的问题解决全过程...
  8. 【编译原理笔记08】语法制导翻译:语法制导定义,SSD的求值顺序,S属性定义与L属性定义
  9. td 提示暂无数据图片同上
  10. 无法打开网上邻居计算机,win7网上邻居在哪 无法访问怎么办【图文】
  11. 北京理工大学计算机面试题,北京理工大学自主招生面试试题综合素质答案技巧.doc...
  12. Vue 组件封装之 Result 结果页
  13. ArcGIS计算图斑的四邻坐标(XMin,XMax,YMin,YMax)
  14. BetaFlight飞控AOCODARC-F7MINI固件编译
  15. 13.DoS防御----BeEF浏览器渗透----暴力破解之美杜莎---DNS指南
  16. jack -学习颜色的调配
  17. 论文阅读笔记-GT U-Net: A U-Net Like Group TransformerNetwork for Tooth Root Segmentation
  18. 可视化实例(三)Tableau基础绘图介绍——横向条形图、双轴折线图、直方图
  19. nyoj 455-黑色帽子
  20. 高德地图坐标的获取( JavaScript API )

热门文章

  1. 使用命名空间解决名字冲突
  2. FIFO,LRU,OPT的命中、调换过程
  3. 程序设计原则——优化程序
  4. D进制的A+B (20)
  5. 指针:自定义函数sumDiff(),调用它来求两个数的和、差
  6. Java Instant类
  7. STM32开发 -- Git的详细使用
  8. DM368开发 -- uboot 使用
  9. 【译】Why Decentralized AI Matters Part II: Technological Enablers
  10. Learn Blockchains by Building One