题目链接

(直接)设\(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)的更多相关文章

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

  2. Maze HDU - 4035(期望dp)

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

  3. HDU 4035 Maze 概率dp,树形dp 难度:2

    http://acm.hdu.edu.cn/showproblem.php?pid=4035 求步数期望,设E[i]为在编号为i的节点时还需要走的步数,father为dfs树中该节点的父节点,son为 ...

  4. hdu 4035 Maze 概率DP

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

  5. HDU 4035 Maze 概率DP 搜索

    解题报告链接: http://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html 先推公式,设计状态,令DP[i]表示在房间i退出要走步数 ...

  6. hdu 4035 Maze(期待更多经典的树DP)

    Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submi ...

  7. HDU 4035 Maze(树形概率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:一棵树,从结点1出发,在每个结点 i 都有3种可能:(1)回到结点1 , 概率 Ki:(2 ...

  8. HDU 3853 LOOPS 期望dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3853 LOOPS Time Limit: 15000/5000 MS (Java/Others)Me ...

  9. HDU 4405 概率期望DP

    有 0到 n 个格子.掷骰子走路,求出到终点的数学期望,有飞行的路线. dp[i] 存储在i位置走到终点的期望. 转移方程dp[i]=(dp[i+1] ----> dp[i+6])/6+1; 有 ...

随机推荐

  1. git 学习小记之图形化界面客户端

    习惯了 Windows 的用户,一直不喜欢用类似命令行的东西来操作,当然我也不是不喜欢,只是操作太慢了.也许 Linux 大神在命令行的帮助下,办事效率翻倍,那也是非常常见的事情..当然我不是大神,所 ...

  2. [整理]zepto的初次使用

    http://www.css88.com/doc/zeptojs_api/ http://chaoskeh.com/blog/some-experience-of-using-zepto.html

  3. J2EE完全手册(二)

    1.2 客户端 (Web客户端,应用程序客户端) 1.2.1 Web客户端: 一般简单讲,就是显示由在Web层的web组件中生成的包含Html 及 XML标记语言的动态Web页面(.jsp[.do]) ...

  4. 20155210潘滢昊 2016-2017-2 《Java程序设计》第8周学习总结

    20155210 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 认识NIO Channel: 衔接数据节点(与IO中的流对比) isOpen close R ...

  5. HDU 1863 畅通工程 最下生成树问题

    题目描述:给出图,要你求是否存在最小生成树,如果存在,要求输出最小权值和,如果不存在,输出? 解题报告:又是一个最裸的克鲁斯卡尔,并且要判断是否存在最小生成树的问题.废话不多说,给个短代码: #inc ...

  6. 对git简单的认识

    了解git工作区.暂存区.版本库: 其中,使用 git add .就是将文件添加到了暂存区:而git commit -m ‘desc’:将暂存区的文件添加到版本库: 每次更新项目的步骤: 1)每次更新 ...

  7. 全国大学API接口分享

    1.获取省份列表: http://119.29.166.254:9090/api/provinces 返回的是省份列表,其中id很重要. 2.通过省份id查询省份城市: http://119.29.1 ...

  8. C# 每月第一天和最后一天

    //每月第一天 - DateTime.Now.Day); //每月最后一天 var endTime=DateTime.Now.AddDays(1 - DateTime.Now.Day).AddMont ...

  9. Kaggle大数据竞赛平台入门

    Kaggle大数据竞赛平台入门 大数据竞赛平台,国内主要是天池大数据竞赛和DataCastle,国外主要就是Kaggle.Kaggle是一个数据挖掘的竞赛平台,网站为:https://www.kagg ...

  10. 使用abstract关键字的使用

    package abstract1.demo01; //使用abstract关键字修饰的类叫做抽象类public abstract class Father { public static void ...