HDU.4035.Maze(期望DP)
(直接)设\(F(i)\)为在\(i\)点走出迷宫的期望步数。答案就是\(F(1)\)。
令\(p_i=1-k_i-e_i\),表示\(i\)点沿着边走的概率;\(d_i=dgr[i]\),即点\(i\)度数。
每个点有三种状态,即$$F(i)=k_i\times F(1)+e_i\times 0+\frac{p_i}{d_i}\sum_{v=to[i]}(F(v)+1)$$
要高斯消元吗。。很重要的一点是图是一棵树。所以叶节点只由父节点(和\(1\))转移而来,而父节点的转移中需要叶节点,我们尝试把叶节点的\(F\)带回去消掉父节点\(F\)中的什么东西。
对于叶节点:$$\begin{aligned}F(i)&=k_i\times F(1)+p_i\times(F(fa)+1)\&=k_i\times F(1)+p_i\times F(fa)+p_i\end{aligned}$$
对于非叶节点:$$F(i)=k_i\times F(1)+\frac{p_i}{d_i}F(fa)+\frac{p_i}{d_i}\sum_{v=son[i]}F(v)+p_i$$
设$$F(i)=A_i\times F(1)+B_i\times F(fa)+C_i$$
把叶节点的\(F(v)=A_v\times F(1)+B_v\times F(fa)+C_v\)带到父节点的\(F(i)\)中:$$F(i)=k_i\times F(1)+\frac{p_i}{d_i}F(fa)+\frac{p_i}{d_i}\sum_{v=son[i]}(A_v\times F(1)+B_v\times F(i)+C_v))+p_i$$$$(1-\frac{p_i}{d_i}\sum_{v=son[i]}B_v)F(i)=(k_i+\frac{p_i}{d_i}\sum_v A_v)F(1)+\frac{p_i}{d_i}F(fa)+p_i+\frac{p_i}{d_i}\sum_v C_v$$
对于叶节点\(v\),\(A_v=k_v,B_v=C_v=p_v\)。
然后可以由\(v\)得到\(A_i,B_i,C_i\)。
对于根节点,\(F(1)=A_1\times F(1)+C_1\),即\(F(1)=\frac{C_1}{1-A_1}\)。
\(A_1=1\)或者存在\((1-\frac{p_i}{d_i}\sum_{v=son[i]}B_v)=1\)时无解。(注意后一个)
//46MS 3056K
#include <cmath>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define eps 1e-9//small
//#define gc() getchar()
#define MAXIN 200000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=10005;
int Enum,H[N],nxt[N<<1],to[N<<1],dgr[N];
double A[N],B[N],C[N],K[N],P[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AE(int u,int v)
{
++dgr[v], to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
++dgr[u], to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum;
}
bool DFS(int x,int f)
{
if(dgr[x]==1 && f)//链。。
{
A[x]=K[x], B[x]=C[x]=P[x];
return 1;
}
double a=K[x],b=P[x]/dgr[x],c=P[x],d=0,p=b;
for(int i=H[x],v; i; i=nxt[i])
if((v=to[i])!=f)
{
if(!DFS(v,x)) return 0;
a+=p*A[v], c+=p*C[v], d+=p*B[v];
}
if(fabs(1-d)<eps) return 0;
A[x]=a/(1-d), B[x]=b/(1-d), C[x]=c/(1-d);
return 1;
}
int main()
{
for(int T=read(),i=1; i<=T; ++i)
{
Enum=0, memset(H,0,sizeof H), memset(dgr,0,sizeof dgr);
int n=read();
for(int i=1; i<n; ++i) AE(read(),read());
for(int i=1; i<=n; ++i) K[i]=1.0*read()/100,P[i]=1-K[i]-(1.0*read()/100);
printf("Case %d: ",i);
if(DFS(1,0) && fabs(1.0-A[1])>eps) printf("%.5lf\n",C[1]/(1.0-A[1]));
else puts("impossible");
}
return 0;
}
HDU.4035.Maze(期望DP)的更多相关文章
- 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< ...
- Maze HDU - 4035(期望dp)
When wake up, lxhgww find himself in a huge maze. The maze consisted by N rooms and tunnels connecti ...
- HDU 4035 Maze 概率dp,树形dp 难度:2
http://acm.hdu.edu.cn/showproblem.php?pid=4035 求步数期望,设E[i]为在编号为i的节点时还需要走的步数,father为dfs树中该节点的父节点,son为 ...
- hdu 4035 Maze 概率DP
题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) ...
- HDU 4035 Maze 概率DP 搜索
解题报告链接: http://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html 先推公式,设计状态,令DP[i]表示在房间i退出要走步数 ...
- hdu 4035 Maze(期待更多经典的树DP)
Maze Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Submi ...
- HDU 4035 Maze(树形概率DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:一棵树,从结点1出发,在每个结点 i 都有3种可能:(1)回到结点1 , 概率 Ki:(2 ...
- HDU 3853 LOOPS 期望dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3853 LOOPS Time Limit: 15000/5000 MS (Java/Others)Me ...
- HDU 4405 概率期望DP
有 0到 n 个格子.掷骰子走路,求出到终点的数学期望,有飞行的路线. dp[i] 存储在i位置走到终点的期望. 转移方程dp[i]=(dp[i+1] ----> dp[i+6])/6+1; 有 ...
随机推荐
- bzoj千题计划279:bzoj4591: [Shoi2015]超能粒子炮·改
http://www.lydsy.com/JudgeOnline/problem.php?id=4591 最后的式子合并同类项 #include<cstdio> #include<i ...
- Stochastic Optimization Techniques
Stochastic Optimization Techniques Neural networks are often trained stochastically, i.e. using a me ...
- 《Two Dozen Short Lessons in Haskell》(二十四)代数类型
这是<Two Dozen Short Lessons in Haskell>这本书的最后一章,第23章没有习题. 这一章里介绍了Haskell如果自定义一种类型,并且用一个双人博弈游戏为例 ...
- [转载]Supporting OData $inlinecount with the new Web API OData preview package
http://www.strathweb.com/2012/08/supporting-odata-inlinecount-with-the-new-web-api-odata-preview-pac ...
- Linux 黑白界面显示
2014年1月14日 15:47:47 不知道别人怎么看,反正我觉得黑白配显示很方便阅读 命令: ls 脚本: ~/.bashrc 指令: alias ls='ls --color=never' 命令 ...
- eclipse:无法删除不存在的工程
把工程改名后,结果在eclipse里面产生了两个工程,一个原工程,一个是新工程,删除原工程报错, 说工程不存在.这个时候拖动原工程到别的workset中,发现原工程消失了,并找到workspace目录 ...
- 解决JavaFTP上传文件假死问题
之前使用ftp上传文件,代码很稳定,用了快三年,因为数据迁移,从搭建了ftp服务器,配置好ip和账号密码后,再使用之前代码发现: 在下载过程中,程序出现假死的现象,就是,既不报错,也不抛异常,还不终止 ...
- 在阿里云申请Symantec免费SSL证书操作流程
2016年阿里云与国内证书颁发机构天威诚信推出了基于Symantec(赛门铁克)的免费SSL证书,有需要免费SSL证书产品的可以前往阿里云进行申请. 申请地址:阿里云云盾证书服务—Symantec免费 ...
- Java 基本语法---Java数组
Java 基本语法---Java数组 0. 概述 数组:相同类型的数据 按照顺序 组成的一种 引用数据类型 . 数据类型:基本数据类型 + 引用数据类型: 引用数据类型:类 + 接口 + 数组 : 一 ...
- ssh隐藏的sftp功能的使用
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能.SFTP 为 SSH ...