hdu4035 Maze(概率dp)
2016-10-11 19:59
363 查看
hdu4035
题目
一颗树形的迷宫,对于每个房间,有几率被杀回到房间1,有几率逃出去,有几率随机到相邻的房间,问逃出去的概率。思路
http://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html推公式的概率dp,精妙之处在于E[i] = ki*E[1] + ei*0 + (1-ki-ei)/m*( E[father[i]]+1 + ∑( E[child[i]]+1 ) );以及设对每个结点:E[i] = Ai*E[1] + Bi*E[father[i]] + Ci;学到了
代码
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <vector> #include <cmath> using namespace std; typedef long long ll; const int MAXN=10010; const double eps=1e-9; double k[MAXN],e[MAXN]; double A[MAXN],B[MAXN],C[MAXN]; vector<int>vec[MAXN]; bool dfs(int t,int pre) { int m=vec[t].size(); A[t]=k[t]; B[t]=(1-k[t]-e[t])/m; C[t]=1-k[t]-e[t]; double temp=0; for(int i=0; i<m; i++) { int v=vec[t][i]; if(v==pre) continue; if(!dfs(v,t))return false; A[t]+=(1-k[t]-e[t])/m*A[v]; C[t]+=(1-k[t]-e[t])/m*C[v]; temp+=(1-k[t]-e[t])/m*B[v]; } if(fabs(temp-1)<eps) return false; A[t]/=(1-temp); B[t]/=(1-temp); C[t]/=(1-temp); return true; } int main() { int T,n,u,v,kase=1; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1; i<=n; i++)vec[i].clear(); for(int i=1; i<n; i++) { scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } for(int i=1; i<=n; i++) { scanf("%lf%lf",&k[i],&e[i]); k[i]/=100; e[i]/=100; } printf("Case %d: ",kase++); if(dfs(1,-1)&&fabs(1-A[1])>eps) { printf("%.6lf\n",C[1]/(1-A[1])); } else printf("impossible\n"); } return 0; }
相关文章推荐
- 【HDU4035】【Maze】【概率dp】【数列求和】
- 【HDU4035】【Maze】【概率dp】
- [hdu4035] Maze【概率dp 数学期望】
- 借助树的概率dp(期望)+数学-好题-hdu-4035-Maze
- HDU 4035 Maze (概率DP)
- [HDU4035]Maze(概率与期望)
- HDU 4035 Maze(树形概率DP)
- hdu 4035 Maze (概率DP)
- HDU 4035 Maze (概率dp)
- hdu 4035 Maze (概率DP)
- hdu 4035 Maze (树形概率dp)
- HDU 4035 Maze 概率DP 搜索
- hdu 4035 Maze 概率DP+树形DP
- HDU4035 Maze 概率DP+图
- HDU 4035 Maze(树上概率DP)
- hdu4035 概率DP求期望
- HDU 4035 Maze 概率dp,树形dp 难度:2
- [ACM] HDU 4035 Maze (概率DP,转化方程)
- HDU-4035 Maze 概率DP
- HDU 4035 Maze(概率dp)