[HDU4035] Maze(概率DP)
有\(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)的更多相关文章
- HDU4035 Maze (概率DP)
转:https://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, ...
- hdu4035 Maze (树上dp求期望)
dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 ...
- HDU4035 Maze 期望DP+树形DP(好题)
题意:有一个树形的迷宫,有N个房间(标号为1~N)以及N-1条通道将它们连通,一开始在1号房间,每进入一个房间i,有k[i]的概率被陷阱杀死回到房间1,有s[i]的概率找到出口逃离迷宫,如果没有找到出 ...
- HDU 4035 Maze 概率dp,树形dp 难度:2
http://acm.hdu.edu.cn/showproblem.php?pid=4035 求步数期望,设E[i]为在编号为i的节点时还需要走的步数,father为dfs树中该节点的父节点,son为 ...
- hdu 4035 Maze 概率DP
题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) ...
- hdu4035(概率dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结 ...
- HDU 4035 Maze 概率DP 搜索
解题报告链接: http://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html 先推公式,设计状态,令DP[i]表示在房间i退出要走步数 ...
- HDU4035 Maze(期望DP)
题意 抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 有n个房间,由n-1条隧道连通起来,形成一棵树,从结点1出发,开始走,在每个结点i ...
- A Dangerous Maze (II) LightOJ - 1395(概率dp)
A Dangerous Maze (II) LightOJ - 1395(概率dp) 这题是Light Oj 1027的加强版,1027那道是无记忆的. 题意: 有n扇门,每次你可以选择其中一扇.xi ...
- 【整理】简单的数学期望和概率DP
数学期望 P=Σ每一种状态*对应的概率. 因为不可能枚举完所有的状态,有时也不可能枚举完,比如抛硬币,有可能一直是正面,etc.在没有接触数学期望时看到数学期望的题可能会觉得很阔怕(因为我高中就是这么 ...
随机推荐
- Openssl pkcs7命令
一.简介 pkcs7命令用于处理DER或者PEM格式的pkcs#7文件. 二.语法 openssl pkcs7 [-inform PEM|DER] [-outform PEM|DER] [-in ...
- 反射机制:获取class的方法
- Ubuntu14.04-LTS 从系统安装到配置可用
1.安装Ubuntu14.04LTS-64bit 使用U盘安装很方便快捷,可以使用老毛桃使用iso模式制作一个U盘启动盘,然后分区安装. 如果使用硬盘安装的话需要注意的问题是: 如果电脑上以前有Lin ...
- query.validate.js使用说明+中文API
转自:http://www.cnblogs.com/hejunrex/archive/2011/11/17/2252193.html 看到一篇好的文章不容易,记录下来以防丢失! 官网地址:http:/ ...
- 搜狐 WEB 标准-前端技术应用规范
- Python之算法基础
1>递归相关: 递归:递归算法是一种直接或间接地调用自身算法的过程,在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且 易于 ...
- ubuntun16.0 登陆密码忘记
1. 开机,如下图所示(没有装虚拟机,手机拍的图片凑合这看把): 2. 此时会有一个选项:Advanced Options for Ubuntu, 选中直接回车 ,如下图: 3. 看到里面有很多选项, ...
- 卡在Initializing Spring root WebApplicationContext
1,多数情况下是连接数据库时出现问题, 2,如果使用mybatis 请查看 xml映射文件是否和对应的java 的dao文件名字相同,或者<mapper namespace="com. ...
- 打开页面默认弹出软键盘,同时兼容iOS和Android
// 示例1 open_soft_keyboard({ input: "#username" }); // 示例2 open_soft_keyboard({ input: 'inp ...
- ExtJS浏览器对象模型BOM——命名空间和用户代理对象、Cookie
BOM(浏览器对象模型(BrowserObjectModel)),允许访问和操控浏览器窗口.研发者通过使用BOM,可移动窗口.更改状态栏文本.执行其它不与页面内容发生直接联系的操作. 本文将从ExtJ ...