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 ...
随机推荐
- tracert命令详解
一.windows.Linux系统下 tracert ip/网站域名 二.mac traceroute IP/域名 ---------2016-10-10 15:29:07-- source:[1]t ...
- 初识redis——mac下搭建redis环境
一.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有 ...
- ajax 、ajax的交互模型、如何解决跨域问题
1.ajax是什么? — AJAX全称为“AsynchronousJavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术. — 不是一种新技 ...
- golang csv,xls,xlsx
要用到的包: "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/transform ...
- mybatis generator
http://blog.csdn.net/sunny243788557/article/details/45166397 http://www.cnblogs.com/smileberry/p/414 ...
- 经验解决Fragment被Replace后仍旧可见的问题
经验解决Fragment被Replace后仍旧可见的问题 网上问的问题,大多会提到替换了Fragment而发现之前被替换的仍旧显示在那里.我个人使用android 2.3 +support 开发包,在 ...
- linux笔记:linux常用命令-目录和文件处理命令
命令格式: 命令 [-选项] [参数] 例: ls -la /etc 注意:个别命令的使用不遵循此格式. 目录处理命令:ls(列目录) 更多选项: -h 以kb等利于人阅读的方式取代字节显示文件大小 ...
- 扩展Date的format方法--格式化日期时间
Date.prototype.format = function (format) { var o = { "M+": this.getMonth() + 1, "d+& ...
- @ControllerAdvice
@ControllerAdvice,是spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强.让我们先看看@ControllerAdvice的实现: @Target(ElementTyp ...
- CFX客户端调用报错
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: unex ...