HDU 4035 Maze 概率dp,树形dp 难度:2
http://acm.hdu.edu.cn/showproblem.php?pid=4035
求步数期望,设E[i]为在编号为i的节点时还需要走的步数,father为dfs树中该节点的父节点,son为dfs树种该节点的子节点的集合,kl[i]为被杀掉的概率,ex[i]为逃出的概率
mv[i]=(1-kl[i]-ex[i])/(1+len(son))
则明显
E[i]=(E[father]+1)*mv[i]+sigma((E[son]+1)*mv[i])+E[1]*K[i]
未知量是E[i],E[father],E[1]
对于叶节点,设E0[i]为该公式中E[1]的系数,EE[i]为该公式中的常数项,EF[i]为E[father]的系数,则可以用这三个值表示E[i]
对于非叶节点,从E[son]中可以得到son的E0,EE,EF,另设ES[i]为E[i]在儿子中积累的系数,则
EF[i]:mv[i]
ES[i]:(由儿子积累来的)sigma(EF[son]*mv[i])
EE[i]:1-kl[i]-ex[i]+sigma(EE[son]*mv[i])
E0[i]:kl[i]+sigma(E0[son]*mv[i])
计算完了之后再EE,E0,EF都除以(1-ES[i]),ES[i]为1当然就不能走出这个迷宫了
这样到了1这个节点就是E[1]=EE[1]/(1-ES[1]-E0[1])
一开始以为exit时应该有E[i]=ex[i]*E[i]+(E[father]+1)*mv[i]+sigma((E[son]+1)*mv[i])+E[1]*K[i],这里思想卡住了,实际上应该是ex[i]*0
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn = 1e4+4;
const double eps = 1e-10;
int n;
double kl[maxn],ex[maxn],mv[maxn];//kill exit move
int first[maxn],deg[maxn];
int dcmp(double a,double b){
if(fabs(a-b)<eps)return 0;
return a>b?1:-1;
} struct edge{
int f,t,nxt;
}e[maxn*2];
void addedge(int f,int t,int ind){
e[ind].nxt=first[f];
e[ind].t=t;
e[ind].f=f;
first[f]=ind;
}
void input(){
memset(first,-1,sizeof first);
memset(deg,0,sizeof deg);
scanf("%d",&n);
for(int i=1;i<n;i++){
int f,t;
scanf("%d%d",&f,&t);
addedge(f,t,2*i);
addedge(t,f,2*i+1);
deg[f]++;
deg[t]++;
}
for(int i=1;i<=n;i++){
scanf("%lf%lf",kl+i,ex+i);
kl[i]/=100;ex[i]/=100;
if(deg[i])mv[i]=(1-ex[i]-kl[i])/deg[i];
}
} double ef[maxn],es[maxn],e0[maxn],ee[maxn];
bool dfs(int s,int father){
ef[s]=mv[s];
//es[s]=ex[s];
e0[s]=kl[s];
ee[s]=1-kl[s]-ex[s];
for(int p=first[s];p!=-1;p=e[p].nxt){
int t=e[p].t;
if(t==father)continue;
if(!dfs(t,s))return false;
es[s]+=ef[t]*mv[s];
e0[s]+=e0[t]*mv[s];
ee[s]+=ee[t]*mv[s];
}
if(dcmp(es[s],1)!=0&&s!=1){
e0[s]/=(1-es[s]);
ef[s]/=(1-es[s]);
ee[s]/=(1-es[s]);
}
return true;
}
double calc(){
memset(ee,0,sizeof ee);
memset(ef,0,sizeof ef);
memset(es,0,sizeof es);
memset(e0,0,sizeof e0); if(!dfs(1,-1)||dcmp(e0[1]+es[1],1)==0)return -1;
return ee[1]/(1-e0[1]-es[1]);
}
int main(){
int T;
scanf("%d",&T);
for(int ti=1;ti<=T;ti++){
input();
double ans=calc();
if(ans>-eps) printf("Case %d: %.6f\n",ti,ans);
else printf("Case %d: impossible\n",ti);
}
return 0;
}
HDU 4035 Maze 概率dp,树形dp 难度:2的更多相关文章
- hdu 4035 Maze 概率DP
题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) ...
- HDU 4035 Maze 概率DP 搜索
解题报告链接: http://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html 先推公式,设计状态,令DP[i]表示在房间i退出要走步数 ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- [HDU 5293]Tree chain problem(树形dp+树链剖分)
[HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...
- 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 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- hdu 4003 Find Metal Mineral 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Humans have discovered a kind of new metal miner ...
- HDU 5758 Explorer Bo(树形DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5758 [题目大意] 给出一棵树,每条路长度为1,允许从一个节点传送到任意一个节点,现在要求在传送次 ...
- 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】
Colorful Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
随机推荐
- [LED]如何配置LCD背光和LED,调试方法
[DESCRIPTION] 如何配置LCD背光和LED,调试方法 [SOLUTION]LCD背光和LED配置文件alps/custom/<proj name>lk/cust_leds.ca ...
- css处理浏览器兼容问题
浏览器的兼容: _ ie6认识 格式:_width:100px;要写在最后面来覆盖前面的. * ie6和ie7都认识 格式:* width:100px;要写在最后面来覆盖前面的. \0 ie8认识 ...
- VisualSVN官网
VisualSVN是一款图形化svn服务器. http://www.visualsvn.com/
- 实体类实现Parcelable(包含boolean类型)
实体类实现Parcelable接口需要实现方法: public ExtSignClockEntity(Parcel in) { timeMess = in.readString(); repeatMe ...
- LayoutParams使用
LayoutParams继承于Android.View.ViewGroup.LayoutParams. LayoutParams相当于一个Layout的信息包,它封装了Layout的位置. ...
- C++从键盘输入文件结束符
当我们使用一个istream对象作为条件时,其效果是检测流的状态.如果流是有效的,即流未遇到错误,那么检测成功.当遇到文件结束符,或遇到一个无效输入时(例如需要将输入读到一个int变量 ...
- 《Java程序设计》实验三 实验报告
实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2 ...
- 《Java程序设计》第四周学习总结
20145224-陈颢文 <Java程序设计>第四周学习总结 教材学习内容总结 第六章 继承与多态 ·继承就是面向对象中,子类继承父类,避免重复的行为定义.重复再程序设计上是非常不好的信号 ...
- Mybatis 学习-1
本次MyBatis基础实例教程主要讲述MyBatis在项目中的配置方法,实体对象的关系映射.关联关系,以及如何实现一个BaseDao的功能 实例数据库的表结构 CREATE TABLE `blog_u ...
- dubug
1.设置断点 2.启动servers端的debug模式 3.运行程序,在后台遇到断点时,进入debug调试状态 ============================= 作用域 功能 快捷键 全局 ...