题目链接

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;
}

hdu4035 Maze 【期望dp + 数学】的更多相关文章

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

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

  2. HDU4035 Maze(期望DP)

    题意 抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 有n个房间,由n-1条隧道连通起来,形成一棵树,从结点1出发,开始走,在每个结点i ...

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

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

  4. 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< ...

  5. HDU4035 Maze (概率DP)

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

  6. CF908D New Year and Arbitrary Arrangement(期望Dp+数学)

    题目大意:给你一个空字符串,你有\(\frac{pa}{pa+pb}\)的概率往字符串最后面加个\(a\),\(\frac{pb}{pa+pb}\)的概率往字符串最后面加个\(b\),当子序列\(ab ...

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

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

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

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

  9. codeforces1097D Makoto and a Blackboard 数学+期望dp

    题目传送门 题目大意: 给出一个n和k,每次操作可以把n等概率的变成自己的某一个因数,(6可以变成1,2,3,6,并且概率相等),问经过k次操作后,期望是多少? 思路:数学和期望dp  好题好题!! ...

随机推荐

  1. python3 练习题100例 (二十二)输入两个字符串,输出两个字符串集合的并集

    题目内容: 输入两个字符串,输出两个字符串集合的并集. 为保证输出结果一致,请将集合内元素排序之后再输出, 如对于集合aset,可输出sorted(aset). 输入格式: 共两行,每一行为一个字符串 ...

  2. Qt5 调试之详细日志文件输出(qInstallMessageHandler)

    注明:以下方法仅适用于 Qt5 及以上版本  函数说明: QtMessageHandler qInstallMessageHandler(QtMessageHandler handler) 此函数在使 ...

  3. 静态栈抽象数据类型stack实现

    #include<stdio.h> #include<stdbool.h> #include<stdlib.h> #define MAX_STACK_SIZE 10 ...

  4. RedHat7.1 安装Oracle12102

    选型: 32位的内存是个瓶颈,已经是64位的时代了.使用64位的CentOS6 和 64位的Oracle 11g R2 在虚拟机器安装,采用hostonly方式设置网络 注意:能上网的网卡要设置一下I ...

  5. js 邮箱和手机号码验证

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. mock.js中新增测试接口无效,返回404

    项目是使用的npm+vue+mock模拟数据 我碰到的是在mock配置文件中新增接口,但是接口在测试时无效,返回404.但是在前端代码中把新接口换成配置文件中之前就有的,然后测试就正常了. 所以按问题 ...

  7. js学习日记-变量的坑

    js变量细节是前端面试经常遇到的问题,可见其重要程度,要想掌握这个知识点,需注意以下几点: 变量提升 所谓变量提升,就是使用了var关键字申明的变量,会提升到所在作用域的顶部.es5的作用域分为全局作 ...

  8. Spring.Net在ASP.NET Mvc里使用的一个小例子

    就贴个小例子,就不注意格式了. 1.下载dll NuGet的下载地址:http://docs.nuget.org/docs/start-here/installing-nuget 在vs的NuGet里 ...

  9. Spring Boot 学习随记

    微架构的思想在各大互联网公司越来越普及,特此记录Spring Boot的一些细节问题! 网上spring-boot的教程一堆一堆,就没有必要再详细记录了 1:建议通过Idea 来创建spring-bo ...

  10. Java实现网页截屏功能(基于phantomJs)

    公司最近有个需求:把用户第一次的测量身体信息和最近一次测量信息进行对比,并且需要把对比的数据截成图片可以发给用户(需要在不打开网页的情况下实时对网页进行截图然后保存到服务器上,返回图片地址),通过网上 ...