期望的大难题,%%ZZZ大佬的解释,不得不说这是一道好题(然而膜题解都没完全看懂,然后就去烦ZZZ大佬)

简单补充几句吧,tmp的理解是个难点,除以tmp的原因是,当我们化简时,子节点也有一个B*f[父节点],这个时候我们化简不掉,怎么办?直接将他放到等式的左边,和f[父节点]合起来,(1-(1-ki-ei)/m*∑(Bj)),这里1就是原来的父节点,然后(1-ki-ei)/m是到这个子节点的概率,乘以Bj。

这是一道树形dp,核心思想是列出dp方程用逆推的方法往前求,将这道图论题转化为数学模型化简
首先这个图有n个点,n-1条边,且两点之间仅有一条边,那么这个图实际上就是一棵树
对于点i:
设f(i)表示在结点i处,要走出迷宫所要走的边数的期望。f(1)即为所求。

若点i是叶子节点,则:
f(i)=ki*f(1)+ei*0+(1-ki-ei)*(f(fa)+1)
f(i)=ki*f(1)+(1-ki-ei)*f(fa)+(1-ki-ei) 叶子式

若点i非叶子节点,则他有父亲节点fa,和若干个儿子节点son:
f(i)=ki*f(1)+ei*0+(1-ki-ei)/m *(f(fa)+1) + (1-ki-ei)/m * ∑(f(son)+1)
f(i)=ki*f(1)+(1-ki-ei)/m *f(fa)+(1-ki-ei)/m*∑(f(son))+(1-ki-ei); 非叶子式
(∑符号是求和的意思,也就是把所有的孩子加起来)

从公式可知求f(i)需要求到f(fa),f(son)
但这是很难求到的,因为要一直往上求,直到f(1),我们要求f(1)来着

假设非叶子节点i是j的父亲
设 tmp*f(i)=Ai*f(1)+Bi*f(fa)+Ci; 我们把这个作为基本式 ,tmp是我们要除掉的系数,先不管他

在非叶子节点中:

f(son) = Aj*f(1)+Bj*f(i)+Cj;
∑(f(son))=∑(Aj*f(1)+Bj*f(i)+Cj);

代入非叶子式得
f(i)=ki*f(1)+(1-ki-ei)/m *f(fa)+(1-ki-ei)/m*∑(Aj*f(1)+Bj*f(i)+Cj)+(1-ki-ei);
化为基本式的形式得:
(1-(1-ki-ei)/m*∑(Bj))*f(i)=(ki+(1-ki-ei)/m*∑(Aj))*f(1)+(1-ki-ei)/m *f(fa)+(1-ki-ei+(1-ki-ei)/m*∑(cj));

代入基本式得:
tmp= (1-(1-ki-ei)/m*∑(Bj))
Ai=(ki+(1-ki-ei)/m*∑(Aj))/tmp
Bi=(1-ki-ei)/m/tmp
Ci=(1-ki-ei+(1-ki-ei)/m*∑(cj))/tmp

观察到 Ai,Bi,Ci 只与j有关的Aj,Bj,Cj 和 与i有关的ki,ei 有关
所以从可以叶子开始逆推得到A1,B1,C1

在叶子节点中 易得:
Ai=ki;
Bi=(1-ki-ei);
Ci=(1-ki-ei);

而f(1)=A1*f(1)+B1*0+C1;//1的父亲是0
f(1)=C1/(1-A1);
若A1趋近于1则无解

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=1e-;
struct node
{
int x,y,next;
}a[];int last[],len;
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
}
double k[],e[];
double A[],B[],C[];
int tot[];
bool dfs(int x,int fa)
{
A[x]=k[x];
B[x]=(-k[x]-e[x])/tot[x];
C[x]=-k[x]-e[x]; double tmp=;
for(int i=last[x];i;i=a[i].next)
{
int y=a[i].y;
if(y!=fa)
{
if(dfs(y,x)==false)return false; A[x]+=(-k[x]-e[x])/tot[x] *A[y];
C[x]+=(-k[x]-e[x])/tot[x] *C[y];
tmp +=(-k[x]-e[x])/tot[x] *B[y];
}
}
if(fabs(tmp-)<eps)return false;
A[x]/=(-tmp);
B[x]/=(-tmp);
C[x]/=(-tmp);
return true;
}
int main()
{
int T;
scanf("%d",&T);
for(int tt=;tt<=T;tt++)
{
int n,x,y;
scanf("%d",&n);
len=;memset(last,,sizeof(last));
memset(tot,,sizeof(tot));
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
ins(x,y);ins(y,x);
tot[x]++;tot[y]++;
}
for(int i=;i<=n;i++)
{
scanf("%lf%lf",&k[i],&e[i]);
k[i]/=;e[i]/=;
} if(dfs(,)==true&&fabs(-A[])>eps)
printf("Case %d: %.6lf\n",tt,C[]/(-A[]));
else
printf("Case %d: impossible\n",tt);
}
return ;
}

caioj1275&&hdu4035: 概率期望值6:迷宫的更多相关文章

  1. caioj1270: 概率期望值1:小象涂色

    DP深似海,得其得天下.——题记 叕叕叕叕叕叕叕叕叕叕叕(第∞次学DP内容)被D飞了,真的被DP(pa)了.这次D我的是大叫着第二题比较难(小象涂色傻b题)的Mocha(zzz)大佬,表示搞个概率DP ...

  2. caioj1272&&codeforces 148D: 概率期望值3:抓老鼠

    这道真的是好题,不卡精度,不卡细节,但是思考的方式很巧妙! 一开始大家跟我想的应该差不多,用f[i][j]表示有i只白老鼠,j只黑老鼠的胜率,然后跑DP,然后我就发现,这样怎么做?还有一种不胜不负的平 ...

  3. caioj1271&&poj3071: 概率期望值2:足球

    见到网上的大佬们都用了位运算..表示看不懂就自己想了,还挺好想的(然而我不会告诉你我因为p的数组问题卡了半小时顺便D了ZZZ大佬的数据) DP方程(伪)就是:第t轮第i个队晋级的可能=第t-1轮第i个 ...

  4. [转]机器学习——C4.5 决策树算法学习

    1. 算法背景介绍 分类树(决策树)是一种十分常用的分类方法.它是一种监管学习,所谓监管学习说白了很简单,就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分 ...

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

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

  6. 决策树的剪枝,分类回归树CART

    决策树的剪枝 决策树为什么要剪枝?原因就是避免决策树“过拟合”样本.前面的算法生成的决策树非常的详细而庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的.因此用这个决策树来 ...

  7. [HDU4035] Maze(概率DP)

    HDU4035 有\(n\)个房间 , 由\(n-1\)条隧道连通起来 , 实际上就形成了一棵树 , 从结点\(1\)出发 , 开始走 , 在每个结点\(i\)都有\(3\)种可能 : \(1.\)被 ...

  8. HDU-4035 Maze (概率DP求期望)

    题目大意:在一个树形迷宫中,以房间为节点.有n间房间,每间房间存在陷阱的概率为ki,存在出口的概率为ei,如果这两种情况都不存在(概率为pi),那么只能做出选择走向下一个房间(包括可能会走向上一个房间 ...

  9. hdu4035(概率dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结 ...

随机推荐

  1. ES6(对象扩展)

    ES6(对象(object)新增特性) 1.简介表示法 o,k 为属性:这种为无方法的情况. 这种为有方法. 2.属性表达式 ES6中,[a]就是 b . 3.新增API 1.数组也是引用类型 2.O ...

  2. 【转】玩玩负载均衡---在window与linux下配置nginx

    最近有些时间,开始接触负载均衡方面的东西,从硬件F5再到Citrix Netscalar.不过因为硬件的配置虽然不复杂,但昂贵的价格也让一般用户望而却步(十几万到几十万),所以只能转向nginx,sq ...

  3. Flask设计带认证token的RESTful API接口[翻译]

    上一篇文章, 使用python的Flask实现一个RESTful API服务器端  简单地演示了Flask实的现的api服务器,里面提到了因为无状态的原则,没有session cookies,如果访问 ...

  4. PHP基础 变量

    $a=123;$b="123";$c='456';$d=<<<a <div style=" qwerqwrqwt </div>a; / ...

  5. 【贪心+前缀】C. Fountains

    http://codeforces.com/contest/799/problem/C [题意] 有n做花园,有人有c个硬币,d个钻石 (2 ≤ n ≤ 100 000, 0 ≤ c, d ≤ 100 ...

  6. 常见Bean映射工具分析评测及Orika介绍

    原地址:http://tech.dianwoda.com/2017/11/04/gao-xing-neng-te-xing-feng-fu-de-beanying-she-gong-ju-orika/ ...

  7. 【Ural1297】Palindrome(后缀数组)

    题意:求一个字符串的最长回文子串 n<=1000 思路:这是一道论文题 需要注意的细节: 1.奇偶分类 2.中间的分割符与最后的附加字母都是最小值,但两者不能相同,否则height可能会出现问题 ...

  8. 【ZJOI2017 Round1练习&BZOJ4767】D1T3 两双手(排列组合,DP)

    题意: 100%的数据:|Ax|,|Ay|,|Bx|,|By| <= 500, 0 <= n,Ex,Ey <= 500 思路:听说这是一道原题 只能往右或者下走一步且有禁止点的简化版 ...

  9. 247. Segment Tree Query II

    最后更新 二刷 09-Jna-2017 利用线段树进行区间查找,重点还是如何判断每一层的覆盖区间,和覆盖去见与当前NODE值域的关系. public class Solution { public i ...

  10. Java第二次作业參考代码

    Java第二次作业參考代码 [程序11] 题目:有1.2.3.4四个数字,能组成多少个互不同样且无反复数字的三位数?都是多少? public class lianxi11 { public stati ...