HDU4035

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

\(1.\)被杀死 , 回到结点\(1\)处 (概率为\(k_i\))

\(2.\)找到出口 , 走出迷宫 (概率为\(e_i\))

\(3.\)和该点相连有\(m\)条边 , 随机走一条

求走出迷宫所要走的边数的期望值

题解

\(1.\)设对每个结点转化为:\(E[i] = Ai*E[1] + Bi*E[father[i]] + Ci;\) $ \ \ $方便dfs中转移

\(2.\)推式子要考虑清楚叶节点的情况 , 要记得乘上概率\(\frac{1}{m}\)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
} const int MAXN=1e4+5;
const double eps=1e-9; double A[MAXN],B[MAXN],C[MAXN],e[MAXN],k[MAXN];
int n,T;
vector <int> G[MAXN]; inline bool dfs(int u,int pre){
int m=G[u].size();
A[u]=k[u];
B[u]=(1-k[u]-e[u])/m;
C[u]=1-k[u]-e[u];
double tmp=0;
for(int i=0;i<m;i++){
int v=G[u][i];
if(v==pre) continue;
if(!dfs(v,u)) return false;
A[u]+=(1-k[u]-e[u])/m*A[v];
C[u]+=(1-k[u]-e[u])/m*C[v];
tmp+=(1-k[u]-e[u])/m*B[v];
}
if(fabs(tmp-1)<eps) return false;//如果$Ei$的系数趋向于0则无解
A[u]/=(1-tmp);//很巧妙地对于叶子节点答案也是正确的
B[u]/=(1-tmp);
C[u]/=(1-tmp);
return true;
} int main(){
T=read();
for(int Case=1;Case<=T;Case++){
n=read();
for(int i=1;i<=n;i++) G[i].clear();
for(int i=1;i<=n-1;i++){
int x=read(),y=read();
G[x].push_back(y);
G[y].push_back(x);
}
for(int i=1;i<=n;i++){
k[i]=(double)read()/100.0;
e[i]=(double)read()/100.0;
}
if((!dfs(1,0))||(fabs(1-A[1])<eps)) printf("Case %d: impossible\n",Case);
else printf("Case %d: %.6lf\n",Case,C[1]/(1-A[1]));
}
}

[HDU4035] Maze(概率DP)的更多相关文章

  1. HDU4035 Maze (概率DP)

    转:https://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, ...

  2. hdu4035 Maze (树上dp求期望)

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

  3. HDU4035 Maze 期望DP+树形DP(好题)

    题意:有一个树形的迷宫,有N个房间(标号为1~N)以及N-1条通道将它们连通,一开始在1号房间,每进入一个房间i,有k[i]的概率被陷阱杀死回到房间1,有s[i]的概率找到出口逃离迷宫,如果没有找到出 ...

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

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

  5. hdu 4035 Maze 概率DP

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

  6. hdu4035(概率dp)

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

  7. HDU 4035 Maze 概率DP 搜索

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

  8. HDU4035 Maze(期望DP)

    题意 抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 有n个房间,由n-1条隧道连通起来,形成一棵树,从结点1出发,开始走,在每个结点i ...

  9. A Dangerous Maze (II) LightOJ - 1395(概率dp)

    A Dangerous Maze (II) LightOJ - 1395(概率dp) 这题是Light Oj 1027的加强版,1027那道是无记忆的. 题意: 有n扇门,每次你可以选择其中一扇.xi ...

  10. 【整理】简单的数学期望和概率DP

    数学期望 P=Σ每一种状态*对应的概率. 因为不可能枚举完所有的状态,有时也不可能枚举完,比如抛硬币,有可能一直是正面,etc.在没有接触数学期望时看到数学期望的题可能会觉得很阔怕(因为我高中就是这么 ...

随机推荐

  1. Django常见出错解决方案汇总-乾颐堂

    一.模板类型错误: 错误原因:在models中漏掉了return: class UserProfile(models.Model): """ 功能说明:        扩 ...

  2. uc_authcode()

    //解用户标识码public static function setAuthCode($auth){ //对 base64 编码的 data 进行解码. $auth = base64_decode($ ...

  3. [SoapUI] 通过Groovy获取SoapUI当前Project所在的目录

    import com.eviware.soapui.support.GroovyUtils def groovyUtils = new GroovyUtils( context ) def proje ...

  4. Docker 实现的 redis 主从

    计划用 Docker 实现 Redis 的主从,简单主从而已.主的名称叫 redis-master 一步步来. 先新建个Dockerfile ,从alpine 开始,比较简单. FROM alpine ...

  5. bootstrap缩略图及警示框制作

    缩略图在网站中最常用的地方就是产品列表页面,一行显示几张图片,有的在图片底下(左侧或右侧)带有标题.描述等信息.Bootstrap框架将这一部独立成一个模块组件.并通过“thumbnail”样式配合b ...

  6. .NET开源MSSQL、Redis监控产品Opserver之MSSQL配置

    MSSQL的配置比较简单,主要包括三部分: 默认配置(defaultConnectionString).集群配置(clusters).单实例配置(instances) defaultConnectio ...

  7. AlwaysOn的数据同步原理

    摘抄自<SQL Server 2012实施与管理实战指南> 镜像的工作原理: 那么主体数据库和镜像数据库是如何同步数据的呢?SQL数据库中任何的数据变化都会先记录到事务日志中,然后才会真正 ...

  8. [GO]errorr接口的使用

    package main import ( "fmt" "errors" ) func main() { erro1 := fmt.Errorf("% ...

  9. left join、right join、inner join、full join

    转自:某一网友 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join ...

  10. shell 编程 变量

    转自:http://blog.csdn.net/qq504196282/article/details/52994249 shell之变量和引用 分类:SHELL编程基础 (470)  (0)  举报 ...