hdu4035 Maze (树上dp求期望)
- dp求期望的题。
- 题意:
- 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树,
- 从结点1出发,开始走,在每个结点i都有3种可能:
- 1.被杀死,回到结点1处(概率为ki)
- 2.找到出口,走出迷宫 (概率为ei)
- 3.和该点相连有m条边,随机走一条
- 求:走出迷宫所要走的边数的期望值。
- 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望。E[1]即为所求。
- 叶子结点:
- E[i] = ki*E[1] + ei*0 + (1-ki-ei)*(E[father[i]] + 1);//因为是到达,i点跑出去的期望步数,所以逃出去的那个概率应该乘以0
- = ki*E[1] + (1-ki-ei)*E[father[i]] + (1-ki-ei);
- 非叶子结点:(m为与结点相连的边数)
- E[i] = ki*E[1] + ei*0 + (1-ki-ei)/m*( E[father[i]]+1 + ∑( E[child[i]]+1 ) );
- = ki*E[1] + (1-ki-ei)/m*E[father[i]] + (1-ki-ei)/m*∑(E[child[i]]) + (1-ki-ei);
- 设对每个结点:E[i] = Ai*E[1] + Bi*E[father[i]] + Ci;
- 对于非叶子结点i,设j为i的孩子结点,则
- ∑(E[child[i]]) = ∑E[j]
- = ∑(Aj*E[1] + Bj*E[father[j]] + Cj)
- = ∑(Aj*E[1] + Bj*E[i] + Cj)
- 带入上面的式子得
- (1 - (1-ki-ei)/m*∑Bj)*E[i] = (ki+(1-ki-ei)/m*∑Aj)*E[1] + (1-ki-ei)/m*E[father[i]] + (1-ki-ei) + (1-ki-ei)/m*∑Cj;
- 由此可得
- Ai = (ki+(1-ki-ei)/m*∑Aj) / (1 - (1-ki-ei)/m*∑Bj);
- Bi = (1-ki-ei)/m / (1 - (1-ki-ei)/m*∑Bj);
- Ci = ( (1-ki-ei)+(1-ki-ei)/m*∑Cj ) / (1 - (1-ki-ei)/m*∑Bj);
- 对于叶子结点
- Ai = ki;
- Bi = 1 - ki - ei;
- Ci = 1 - ki - ei;
- 从叶子结点开始,直到算出 A1,B1,C1;
- E[1] = A1*E[1] + B1*0 + C1;
- 所以
- E[1] = C1 / (1 - A1);
- 若 A1趋近于1则无解...
上面这一问题,中发现E[1]消不去,然后就用算出A,B,C的方式来求解。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- #include<cmath>
- #include<vector>
- using namespace std;
- const int MAXN=;
- const double eps=1e-;//这里1e-8会WA。设为1e-9和1e-10可以
- double k[MAXN],e[MAXN];
- double A[MAXN],B[MAXN],C[MAXN];
- int T,n,u,v,iCase;
- vector<int>vec[MAXN];//存树
- bool dfs(int t,int pre)//t的根结点是pre
- {
- int m=vec[t].size();//点t的度
- A[t]=k[t];
- B[t]=(-k[t]-e[t])/m;
- C[t]=-k[t]-e[t];
- double tmp=;
- for(int i=;i<m;i++)
- {
- int v=vec[t][i];
- if(v==pre)continue;
- if(!dfs(v,t))return false;
- A[t]+=(-k[t]-e[t])/m*A[v];
- C[t]+=(-k[t]-e[t])/m*C[v];
- tmp+=(-k[t]-e[t])/m*B[v];
- }
- if(fabs(tmp-)<eps)return false;
- A[t]/=(-tmp);
- B[t]/=(-tmp);
- C[t]/=(-tmp);
- return true;
- }
- int main()
- {
- scanf("%d",&T);
- while(T--)
- {
- iCase++;
- scanf("%d",&n);
- for(int i=;i<=n;i++)vec[i].clear();
- for(int i=;i<n;i++)
- {
- scanf("%d%d",&u,&v);
- vec[u].push_back(v);
- vec[v].push_back(u);
- }
- for(int i=;i<=n;i++)
- {
- scanf("%lf%lf",&k[i],&e[i]);
- k[i]/=;
- e[i]/=;
- }
- printf("Case %d: ",iCase);
- if(dfs(,-)&&fabs(-A[])>eps)
- {
- printf("%.6lf\n",C[]/(-A[]));
- }
- else printf("impossible\n");
- }
- }
hdu4035 Maze (树上dp求期望)的更多相关文章
- HDU3853-LOOPS(概率DP求期望)
LOOPS Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others) Total Su ...
- Poj 2096 (dp求期望 入门)
/ dp求期望的题. 题意:一个软件有s个子系统,会产生n种bug. 某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中. 求找到所有的n种bug,且每个子系统都找到bug,这样所要 ...
- POJ2096 Collecting Bugs(概率DP,求期望)
Collecting Bugs Ivan is fond of collecting. Unlike other people who collect post stamps, coins or ot ...
- POJ 2096 (dp求期望)
A - Collecting Bugs Time Limit:10000MS Memory Limit:64000KB 64bit IO Format:%I64d & %I64 ...
- HDU4035 Maze (概率DP)
转:https://www.cnblogs.com/kuangbin/archive/2012/10/03/2711108.html 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, ...
- HDU-4035 Maze (概率DP求期望)
题目大意:在一个树形迷宫中,以房间为节点.有n间房间,每间房间存在陷阱的概率为ki,存在出口的概率为ei,如果这两种情况都不存在(概率为pi),那么只能做出选择走向下一个房间(包括可能会走向上一个房间 ...
- loj 1038(dp求期望)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25915 题意:求一个数不断地除以他的因子,直到变成1的时候 除的次 ...
- HDU-3853 LOOPS(概率DP求期望)
题目大意:在nxm的方格中,从(1,1)走到(n,m).每次只能在原地不动.向右走一格.向下走一格,概率分别为p1(i,j),p2(i,j),p3(i,j).求行走次数的期望. 题目分析:状态转移方程 ...
- HDU-4405 Aeroplane chess(概率DP求期望)
题目大意:一个跳棋游戏,每置一次骰子前进相应的步数.但是有的点可以不用置骰子直接前进,求置骰子次数的平均值. 题目分析:状态很容易定义:dp(i)表示在第 i 个点出发需要置骰子的次数平均值.则状态转 ...
随机推荐
- MySQL常用命令和语句
1.常用SQL语句 1)常用函数/*type可取值为:MICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEARSECOND_MICROSECONDMINUT ...
- Python 学习日志9月20日
9月20日 周三 多大年龄了,还活得像个小孩.——急什么,人生又不长. 你习惯了思考宇宙星辰,一百年真的不长,一生也就不那么长,许多人的价值观念你也就无法理解.同样,许多人也无法理解你的价值观念,感兴 ...
- Codeforces Round #318 (Div. 2) B Bear and Three Musketeers (暴力)
算一下复杂度.发现可以直接暴.对于u枚举a和b,判断一下是否连边,更新答案. #include<bits/stdc++.h> using namespace std; int n,m; ; ...
- UVA 1151 Buy or Build (最小生成树)
先求出原图的最小生成树,然后枚举买哪些套餐,把一个套餐内的点相互之间边权为0,直接用并查集缩点.正确性是基于一个贪心, 在做Kruskal算法是,对于没有进入最小生成树的边,排序在它前面的边不会减少. ...
- pb2.text_format.Merge(f.read(), self.solver_param) AttributeError: 'module' object has no attribute 'text_format'
http://blog.csdn.net/qq_33202928/article/details/72526710
- 【转载】WPF DataGrid 性能加载大数据
作者:过客非归 来源:CSDN 原文:https://blog.csdn.net/u010265681/article/details/76651725 WPF(Windows Presentatio ...
- 用border实现三角形的过程
div{ width:100px; height:100px; background:yellow; border-top: 20px solid red; border-right:20px sol ...
- 7.逻辑运算 and or not
1)优先级 ()> not > and > o r and:真真为真,真假为假 ,假假为假 or:真真为真,真假为真,假假为假 print(2 > 1 and 1 < ...
- fossil 代理设置
C:\>fossil user new Joe C:\>fossil user default Joe 设置账户 fossil setting proxy http://-:-fossil ...
- html中注释的问题
在修改jsp页面的时候遇到了一个有点难懂的注释,mark一下 <script> <!-- alert("js code"); //--> </scri ...