HDU 4035 Maze(树形概率DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035
题意:一棵树,从结点1出发,在每个结点 i 都有3种可能:(1)回到结点1 , 概率 Ki;(2)结束,概率 Ei;(3)随机走一条边。(ki+ei+随机走=1) 求到结束需要走的边数的期望。
假设E[i]为点i到结束走边数的期望,则有
(以下m为点的度数)
E[i]=ki*E[1]+(1-ei-ki)/m*(E[fa[i]]+1)若i为叶子节点.
=ki*E(1)+(1-ki-ei)*E(father)+(1-ki-ei)
E[i]=ki*E[1]+(1-ei-ki)/m*(E[fa[i]]+1)+(1-ei-ki)/m*(Sum(E[son[i]]+1))i不为叶子节点
=ki*E(1)+(1-ki-ei)/m *E(father)+(1-ki-ei)/m*SUM(E(child))+(1-ki-ei) 作为1式
我们发现,这样求非常麻烦,若是n小一点大可用高斯消元求解,可这题的n为10000,无法用高斯消元。
对于每个E[i],我们令E[i]=Ai*(E[1])+Bi*(E[fa[i]])+Ci
E[child]=Aj*E[1]+Bj*E[i]+Cj
Sum(E[child])=Sum(Aj*E[1]+Bj*E[i]+Cj)
带入1式:ki*E(1)+(1-ki-ei)/m *E(father)+(1-ki-ei)/m*Sum(Aj*E[1]+Bj*E[i]+Cj)+(1-ki-ei)
可得:(ki+(1-ki-ei)/m*SUM(Aj))*E(1)+(1-ki-ei)/m *E(father)+(1-ki-ei+(1-ki-ei)/m*SUM(cj))
与刚才的E[i]=Ai*(E[1])+Bi*(E[fa[i]])+Ci对比一下发现:
Ai=(ki+(1-ki-ei)/m*SUM(Aj))
Bi=(1-ki-ei)/m
Ci=(1-ki-ei+(1-ki-ei)/m*SUM(cj))
对于叶子节点,有
Ai=ki
Bi=1-ki-ei
Ci=1-ki-ei
倒推即可,还有,
E(1)=A1*E(1)+B1*0+C1
E(1)=C1/(1-A1)
若是上述式子中的分母出现0则无解。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
const double eps=1e-;
int tot,go[],first[],next[];
double a[],b[],c[],k[],e[];
int n,du[];
void insert(int x,int y){tot++;go[tot]=y;next[tot]=first[x];first[x]=tot;}
void add(int x,int y){insert(x,y);insert(y,x);}
bool dfs(int x,int fa){
bool Isleave=;
double tmp=;
a[x]=k[x];
b[x]=c[x]=(-k[x]-e[x]);
b[x]/=du[x];
for (int i=first[x];i;i=next[i]){
int pur=go[i];
if (pur==fa) continue;
Isleave=;
if (!dfs(pur,x)) return false;
a[x]+=a[pur]*(-k[x]-e[x])/du[x];
c[x]+=c[pur]*(-k[x]-e[x])/du[x];
tmp+=(b[pur])*(-k[x]-e[x])/du[x];
}
if (fabs(tmp-)<=eps) return false;
a[x]/=(-tmp);
b[x]/=(-tmp);
c[x]/=(-tmp);
return true;
}
int main(){
int T,Tcase=;
scanf("%d",&T);
while (T--){
Tcase++;
tot=;
memset(first,,sizeof first);
memset(du,,sizeof du);
scanf("%d",&n);
for (int i=;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
du[x]++;
du[y]++;
}
for (int i=;i<=n;i++){
scanf("%lf%lf",&k[i],&e[i]);
k[i]/=;e[i]/=;
}
printf("Case %d: ",Tcase);
if (dfs(,)&&fabs(-a[])>eps){
printf("%.6f\n",c[]/(-a[]));
}
else{
printf("impossible\n");
}
}
}
HDU 4035 Maze(树形概率DP)的更多相关文章
- hdu 5094 Maze 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092176.html 题目链接:hdu 5094 Maze 状态压缩dp+广搜 使用广度优先 ...
- 【BZOJ 2878】 2878: [Noi2012]迷失游乐园 (环套树、树形概率DP)
2878: [Noi2012]迷失游乐园 Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m ...
- 【bzoj3566】[SHOI2014]概率充电器 树形概率dp
题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器,您生活不可或缺的 ...
- HDU 4035:Maze(概率DP)
http://acm.split.hdu.edu.cn/showproblem.php?pid=4035 Maze Special Judge Problem Description When w ...
- 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< ...
- HDU 4089 Activation(概率DP)(转)
11年北京现场赛的题目.概率DP. 公式化简起来比较困难....而且就算结果做出来了,没有考虑特殊情况照样会WA到死的.... 去参加区域赛一定要考虑到各种情况. 像概率dp,公式推出来就很容易写 ...
- HDU 4405 Aeroplane chess (概率DP)
题意:你从0开始,要跳到 n 这个位置,如果当前位置是一个飞行点,那么可以跳过去,要不然就只能掷骰子,问你要掷的次数数学期望,到达或者超过n. 析:概率DP,dp[i] 表示从 i 这个位置到达 n ...
- HDU - 5001 Walk(概率dp+记忆化搜索)
Walk I used to think I could be anything, but now I know that I couldn't do anything. So I started t ...
- HDU 4035 Maze 概率dp,树形dp 难度:2
http://acm.hdu.edu.cn/showproblem.php?pid=4035 求步数期望,设E[i]为在编号为i的节点时还需要走的步数,father为dfs树中该节点的父节点,son为 ...
随机推荐
- python编程之字符串转处理
比如255的16进制是FF. 转换成整型就是 int("FF",16) console上输出就是255 int("FFFF",16)就是65535 如 ...
- Linux 硬连接和软连接的原理 (in使用)
引子 目前,UNIX的文件系统有很多种实现,例如UFS(基于BSD的UNIX文件系统).ext3.ext4.ZFS和Reiserfs等等. 不论哪一种文件系统,总是需要存储数据.硬盘的最小存储单位是扇 ...
- 读书笔记:java并发
java中主要的同步机制是关键字synchronized,它提供一种独占锁,但是 同步这个术语还包括validate类型的变量,显示锁(Explicit Lock)以及原子变量. -------显示锁 ...
- bzoj3174 [Tjoi2013]拯救小矮人
Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...
- 使用JS截取字符串函数详解
一.函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=theString.split(”|”); //a ...
- java java.uitl.Random产生随机数
通过使用java.uitl.Random产生一个1-10内的随机数.例: Random random = new Random(); int i = Math.abs(random.nextInt() ...
- Visual Studio 2008项目中WinForm窗口图标显示为类图标,仅仅能打开代码而无法打开视图问题解决
背景: 今天打开一个Winform项目的时候.图标显示为类文件的样子而不是窗口的样子,在代码中右键也没有View Designer选项.双击图标打开的是代码而非窗口设计界面,百度后也没 ...
- hdu4000 && hrbust1625
ikki的数字 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 22(12 users) Total Accepted: 9(8 use ...
- Linux多任务编程——进程
进程编程常用函数 1--- fork pitd_t fork(void); 创建一个新的子进程,其父进程为调用 fork() 函数的进程: 返回值:成功:子进程返回 0,父进程返回 子进程 PID:失 ...
- UIWindow in iOS
这篇文章,我将分享对UIWindow我所知道的东西. keyWindow 一个应用能够有许多UIWindow,“The key window”是其中一个,被设计用来接受键盘和其他与点击无关的事件.一个 ...