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

时间:2021-10-26 11:05:12

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的更多相关文章

  1. hdu 4035 Maze 概率DP

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

  2. HDU 4035 Maze 概率DP 搜索

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

  3. hdu 4514 并查集&plus;树形dp

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  4. &lbrack;HDU 5293&rsqb;Tree chain problem&lpar;树形dp&plus;树链剖分&rpar;

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

  5. poj 2096 Collecting Bugs &amp&semi;&amp&semi; ZOJ 3329 One Person Game &amp&semi;&amp&semi; hdu 4035 Maze——期望DP

    poj 2096 题目:http://poj.org/problem?id=2096 f[ i ][ j ] 表示收集了 i 个 n 的那个. j 个 s 的那个的期望步数. #include< ...

  6. HDU 5293 Tree chain problem 树形dp&plus;dfs序&plus;树状数组&plus;LCA

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...

  7. hdu 4003 Find Metal Mineral 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Humans have discovered a kind of new metal miner ...

  8. HDU 5758 Explorer Bo(树形DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5758 [题目大意] 给出一棵树,每条路长度为1,允许从一个节点传送到任意一个节点,现在要求在传送次 ...

  9. 2017 Multi-University Training Contest - Team 1 1003&amp&semi;&amp&semi;HDU 6035 Colorful Tree【树形dp】

    Colorful Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

随机推荐

  1. SWFObject Flash 增强插件

    SWFObject 2提供两种优化flash播放器的嵌入方法:基于标记的方法和依赖于js的方法. SWFObject 2提供一个js的API,为嵌入SWF文件和获取Flash播放器的相关信息提供了一个 ...

  2. Effective C&plus;&plus; -----条款14&colon; 在资源管理类中小心copying行为

    复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为. 普遍而常见的RAII class copying行为是:抑制copying(使用私有继承 ...

  3. tencent&colon;&sol;&sol;message协议

    tencent://message协议 |举报|字号 订阅     相信很多朋友在访问别人的博客.网上商城时可能会发现上都有这样的小玩意, 点击下就可以弹出对话框和主人进行对话,而且无需加对方为好友. ...

  4. poj 2479 Maximum sum &lpar;最大字段和的变形&rpar;

    题目链接:http://poj.org/problem?id=2479 #include<cstdio> #include<cstring> #include<iostr ...

  5. &lpar;Matlab&rpar;GPU计算所需的配置

    电脑:联想扬天 M4400 系统:win 7 X64 硬件:NVIDIA GeForce GT 740M 独显2G     硬件驱动: 软件: Matlab 2015a   %需要安装 Paralle ...

  6. M2postmortem

    设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 答:我们的软件主要解决信息提取的问题.定义清晰:要提取的内容包括于计算机科学相关内容的标题.作者. ...

  7. Python:ModuleNotFoundError&colon; No module named &&num;39&semi;windows&&num;39&semi;

    pymouse安装后,又出现了ModuleNotFoundError: No module named 'windows'的错误 解决: 下载安装pyhook:http://www.lfd.uci.e ...

  8. C&num;&lowbar;Demo&lowbar;摄像头实时&lowbar;4线程人脸识别注册开发全过程

    v效率有点低,大家看看哪里开可以节省时间?源代码:https://github.com/catzhou2002/ArcFaceDemo说实话,为了提高识别效率,我也是竭尽所能,干了不少自认为的优化,如 ...

  9. iOS UI-AlertView(警示框)和ActionSheet(选择框、操作表单)

    #import "ViewController.h" @interface ViewController ()<UIAlertViewDelegate,UIActionShe ...

  10. MySQL 原理性

    1.MySQL的复制原理以及流程 (1).复制基本原理流程 1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中: 2. 从:io线程——在使用start ...