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线程知识再研习B
使用threading.Thread模块,也有两种使用方法,可以用类,也可以在实例化对象中传入函数或类实例. #!/usr/bin/env python # -*- coding: utf-8 -*- ...
- LeetCode_Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- 浅谈PCB敷铜的“弊与利”
敷铜作为PCB设计的一个重要环节,不管是国产的青越锋PCB设计软件,还国外的一些Protel,PowerPCB都提供了智能敷铜功能,那么怎样才能敷好铜,我将自己一些想法与大家一起分享,希望能给同行带来 ...
- PowerShell正则表达式(一) 定义模式
PowerShell正则表达式(一) 定义模式 7 29 9月, 2013 在 Powershell tagged 正则表达式 by Mooser Lee 本文索引 [隐藏] 1限定符 2识别IP地 ...
- JVM基础和调优(三)
主要讲解垃圾回收的算法 上面我们已经了解到了,JVM的体系的结构,这次我们来说一下垃圾回收的算法. 1. 最开始的想法,或者说垃圾回收的最容易想到的就是:引用计数(reference count) 我 ...
- sicily 1099 Packing Passengers
/**** 题意: 求x,y 满足 x*pa+y*pb=n 同时使得 p = x*ca+y*cb的值最小,若有多种可能,则选择最大x值的组合** 分析: x*pa+y*pb=n 可以用 线性同 ...
- amcharts报表制作
fusioncharts官网:http://www.fusioncharts.com/demos/gallery/#column-and-bar 最近使用amcharts fb4,flashBuild ...
- Bloom Filter 算法具体解释
Bloom Filter 算法 Bloom filter是由Burton Bloom 在1970年提出的,其后在P2P上得到了广泛的应用.Bloom filter 算法可用来查询某一数据是否在某一数据 ...
- Android基于WIFI实现电脑和手机间数据传输的技术方案研究
Android手机和电脑间基于wifi进行数据传输,从技术上讲,主要有两种方案: 一种是通过ftp协议实现,Android手机作为数据传输过程中的ftp服务器: 一种是通过http协议实现.Andro ...
- 如何实现带照片缩略图的Listview
ackage com.demo; import java.util.ArrayList; import android.app.Activity; import android.content.Con ...