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 ...
随机推荐
- ORACLE 总结
1. diagnostic file(alertlog, tracefile, redolog), 监控数据库动作时间点 [troubleshooting] alertlog : 确认checkpoi ...
- Android 监听键盘的弹起与收缩
Android 监听键盘的弹起与收缩 由于android不存在该监听的API 所以需要自己去处理 先上代码 /* android:windowSoftInputMode="stateAlwa ...
- POJ 2484 A Funny Game(神题!)
一开始看这道博弈题的时候我就用很常规的思路去分析了,首先先手取1或者2个coin后都会使剩下的coin变成线性排列的长条,然后无论双方如何操作都是把该线条分解为若干个子线条而已,即分解为若干个子游戏而 ...
- Android软键盘弹出时把布局顶上去的解决方法
原文: 解决Andriod软键盘出现把原来的布局给顶上去的方法(转) 链接:http://blog.sina.com.cn/s/blog_9564cb6e0101g2eb.html 决方法,在main ...
- C++常量(C++数值常量、字符串常量、符号常量)
http://see.xidian.edu.cn/cpp/biancheng/view/104.html 字符串常量 用双撇号括起来的部分就是字符串常量,如"abc"," ...
- 有关使用Maven常见问题总结(Eclipse中使用Maven、Maven项目部署到tomcat等问题)
http://blog.csdn.net/sunitjy/article/details/42709311 ********************************************** ...
- Graph-tool简介 - wiki
graph-tool is a Python module for manipulation and statistical analysis of graphs[disambiguation nee ...
- css三级下拉的导航栏
#menu{ height: 65px; width:100%; background-color: rgba(0, 0, 0, 0.5);}#menu ul{ list-style: none;}# ...
- android AutoCompleteTextView和Spinner选中项加亮
package com.example.spinnerexample; import java.util.ArrayList; import java.util.List; import androi ...
- linux笔记:软件包管理-软件包简介
软件包分类: 1.源码包: 2.二进制包(在centos里就是RPM包.和源码包的区别在于已经经过编译.) 源码包的优点和缺点: RPM包的优点和缺点: