期望的大难题,%%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. powerdesigner批量导出sql

  2. python010 Python3 元组

    Python3 元组Python 的元组与列表类似,不同之处在于元组的元素不能修改.元组使用小括号,列表使用方括号.元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可.如下实例: tup1 = ...

  3. 74. Spring Data JPA方法定义规范【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 事情的起因:有人问过我们这个这个问题:为什么我利用Spring data jpa写的方法没有按照我想要的情况进行执行呢?我记得当时只是告诉他你你先 ...

  4. [CodePlus2017]汀博尔

    Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 158  Solved: 61[Submit][Status][Discuss] Description ...

  5. C#.net中当地址有中文时,图片无法显示解决方法

    原文发布时间为:2008-11-05 -- 来源于本人的百度文章 [由搬家工具导入] 搞了半天都无法正常显示图片, string path = Server.MapPath("." ...

  6. Object_c tabbar菜单栏在切换的时候,颜色变灰的问题

    在界面切换的时候,有时候tabbar整条颜色都会变灰,如下: 而正常的应该如下: 在所有的父类加上: self.navigationController.navigationBar.transluce ...

  7. 【Java源码】集合类-LinkedList

    一.类继承关系 LinkedList和ArrayList都实现了List接口.所以有List的特性,同时LinkedList也实现了Deque,所以它也具有双端队列和栈的特性. public clas ...

  8. THUPC2017看题总结

    THUPC2017 看题总结 #2402. 「THUPC 2017」天天爱射击 / Shooting 果题. 求当前子弹能会使多少块木板损坏,发现因为木板会随着子弹数目的增加而更加容易损坏,故此询问具 ...

  9. loj6171/bzoj4899 记忆的轮廊(期望dp+优化)

    题目: https://loj.ac/problem/6171 分析: 设dp[i][j]表示从第i个点出发(正确节点),还可以有j个存档点(在i点使用一个存档机会),走到终点n的期望步数 那么 a[ ...

  10. Java的循环结构

    以下内容引用自http://wiki.jikexueyuan.com/project/java/loop-control.html: 可能存在一种情况,当需要执行的代码块数次,通常被称为一个循环.Ja ...