hdu4035之经典慨率DP
Maze
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)
Total Submission(s): 1419 Accepted Submission(s): 511
Special Judge
The maze consisted by N rooms and tunnels connecting these rooms. Each pair of rooms is connected by one and only one path. Initially, lxhgww is in room 1. Each room has a dangerous trap. When lxhgww step into a room, he has a possibility to be killed and restart
from room 1. Every room also has a hidden exit. Each time lxhgww comes to a room, he has chance to find the exit and escape from this maze.
Unfortunately, lxhgww has no idea about the structure of the whole maze. Therefore, he just chooses a tunnel randomly each time. When he is in a room, he has the same possibility to choose any tunnel connecting that room (including the tunnel he used to come
to that room).
What is the expect number of tunnels he go through before he find the exit?
At the beginning of each case is an integer N (2 ≤ N ≤ 10000), indicates the number of rooms in this case.
Then N-1 pairs of integers X, Y (1 ≤ X, Y ≤ N, X ≠ Y) are given, indicate there is a tunnel between room X and room Y.
Finally, N pairs of integers Ki and Ei (0 ≤ Ki, Ei ≤ 100, Ki + Ei ≤ 100, K1 = E1 = 0) are given, indicate the percent of the possibility of been killed and exit in the ith room.
3
3
1 2
1 3
0 0
100 0
0 100
3
1 2
2 3
0 0
100 0
0 100
6
1 2
2 3
1 4
4 5
4 6
0 0
20 30
40 30
50 50
70 10
20 60
Case 1: 2.000000
Case 2: impossible
Case 3: 2.895522
有一颗树n个结点n-1条边,根结点为1
对于在点i下一步有3种情况:
1:被杀死回到点1 --- 概率为ki
2:找到出口退出----慨率为ei
3:沿着边进入下一个点
求从点1開始到退出的平均须要走的边数
/*分析:
对于点i:
1,点i是叶子结点,则:
E(i)=ki*E(1)+ei*0+(1-ki-ei)*(E(father)+1)
=>E(i)=ki*E(1)+(1-ki-ei)*E(father)+(1-ki-ei)
2,点i非叶子结点,则:
E(i)=ki*E(1)+ei*0+(1-ki-ei)/m *(E(father)+1)+(1-ki-ei)/m*SUM(E(child)+1)
=>E(i)=ki*E(1)+(1-ki-ei)/m *E(father)+(1-ki-ei)/m*SUM(E(child))+(1-ki-ei);//作为1式 从公式可知求E(i)须要求到E(father),E(child)
但这是非常难求到的,由于即使是叶子结点也须要知道E(1),可是E(1)是未知的须要求的 如果:E(i)=Ai*E(1)+Bi*E(father)+Ci;//作为2式 所以:E(child)=Aj*E(1)+Bj*E(i)+Cj;
=>SUM(E(child))=SUm(Aj*E(1)+Bj*E(i)+Cj);
带入1式
=>E(i)=ki*E(1)+(1-ki-ei)/m *E(father)+(1-ki-ei)/m*SUm(Aj*E(1)+Bj*E(i)+Cj)+(1-ki-ei);
=>(1-(1-ki-ei)/m*SUM(Bj))*E(i)=(ki+(1-ki-ei)/m*SUM(Aj))*E(1)+(1-ki-ei)/m *E(father)+(1-ki-ei+(1-ki-ei)/m*SUM(cj));
与上述2式对照得到:
Ai=(ki+(1-ki-ei)/m*SUM(Aj)) / (1-(1-ki-ei)/m*SUM(Bj))
Bi=(1-ki-ei)/m / (1-(1-ki-ei)/m*SUM(Bj))
Ci=(1-ki-ei+(1-ki-ei)/m*SUM(cj)) / (1-(1-ki-ei)/m*SUM(Bj))
所以Ai,Bi,Ci仅仅与i的孩子Aj,Bj,Cj和本身ki,ei有关
于是能够从叶子開始逆推得到A1,B1,C1
在叶子节点:
Ai=ki;
Bi=(1-ki-ei);
Ci=(1-ki-ei);
而E(1)=A1*E(1)+B1*0+C1;
=>E(1)=C1/(1-A1);
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <map>
#include <cmath>
#include <iomanip>
#define INF 99999999
typedef long long LL;
using namespace std; const int MAX=10000+10;
const double eps=1e-9;
int n,size;
int head[MAX];
double A,B,C,k[MAX],e[MAX]; struct Edge{
int v,next;
Edge(){}
Edge(int V,int NEXT):v(V),next(NEXT){}
}edge[MAX*2]; void Init(){
memset(head,-1,sizeof head);
size=0;
} void InsertEdge(int u,int v){
edge[size]=Edge(v,head[u]);
head[u]=size++;
} void dfs(int u,int father){
double a=0,b=0,c=0,p;
int m=0;
for(int i=head[u]; i != -1;i=edge[i].next){
int v=edge[i].v;
if(v == father)continue;
dfs(v,u);
a+=A;
b+=B;
c+=C;
++m;
}
if(father != -1)++m;
p=(1-k[u]-e[u])/m;
A=(k[u]+p*a)/(1-p*b);
B=p/(1-p*b);
C=(1-k[u]-e[u]+p*c)/(1-p*b);
} int main(){
int t,u,v,num=0;
scanf("%d",&t);
while(t--){
scanf( "%d",&n);
Init();
for(int i=1;i<n;++i){
scanf("%d%d",&u,&v);
InsertEdge(u,v);
InsertEdge(v,u);
}
for(int i=1;i<=n;++i){
scanf("%lf%lf",&k[i],&e[i]);
k[i]/=100;
e[i]/=100;
}
dfs(1,-1);
if(fabs(A-1)<eps)printf("Case %d: impossible\n",++num);
else printf("Case %d: %.6f\n",++num,C/(1-A));
}
return 0;
}
hdu4035之经典慨率DP的更多相关文章
- ZOJ3640之简单慨率DP
Help Me Escape Time Limit: 2 Seconds Memory Limit: 32768 KB Background If thou doest well, ...
- Uva 10891 经典博弈区间DP
经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- NYOJ90 整数划分(经典递归和dp)
整数划分 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1. 正 ...
- hoj 2662 经典状压dp // MyFirst 状压dp
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. ...
- POJ 1185 经典状压dp
做了很久的题 有注释 #include<stdio.h> #include<string.h> #include<algorithm> #include<ma ...
- hdu3534,个人认为很经典的树形dp
题目大意为,求一个树的直径(最长路),以及直径的数量 朴素的dp只能找出某点开始的最长路径,但这个最长路径却不一定是树的直径,本弱先开始就想简单了,一直wa 直到我看了某位大牛的题解... 按照那位大 ...
- poj 2342 Anniversary party_经典树状dp
题意:Ural大学有n个职员,1~N编号,他们有从属关系,就是说他们关系就像一棵树,父节点就是子节点的直接上司,每个职员有一个快乐指数,现在要开会,职员和职员的直接上司不能同时开会,问怎才能使开会的快 ...
- CF 319C(Kalila and Dimna in the Logging Industry-斜率DP,注意叉积LL溢出)
C. Kalila and Dimna in the Logging Industry time limit per test 2 seconds memory limit per test 256 ...
随机推荐
- Java集合里的一些“坑”
这里主要谈下Java集合在使用中容易被忽略.又容易出现的两个“坑”,一个是集合与数组互相转换,另一个是集合遍历删除.主要通过代码演示. 一.集合与数组互相转换中的“坑” //Test1.java pa ...
- C# 多线程多文件批量下载---子线程中更新UI 实例
代码1: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;usi ...
- [tensorflow]的安装
1 pip install 最简单直接的方法,通过pip install安装,命令如下: pip install tensorflow-gpu //安装gpu版tensorflow pip insta ...
- Mariadb 10.2中的json使用及应用场景思考
-- 创建示例表DROP TABLE IF EXISTS `t_base_user`;CREATE TABLE `t_base_user` ( `USER_ID` char(36) CHARACT ...
- EF – 1.模式
3种数据库 code first model first database first 创建EF http://www.cnblogs.com/tangge/p/3834578.html DbSet ...
- 04 java 基础:数据类型
java 数据类型:基本类型与引用类型 基本类型:数值型,其中数值型分为整型.浮点型,整型包括 byte.short .int.long ,默认为 int 类型.浮点类型分为单精度.双精度,分为 fl ...
- js 利用事件委托解决mousedown中的click
有一个需求是这样的: 父元素div绑定一个mousedown事件,子元素a绑定一个click事件. 看解构: <div id="nav"> <a href=&qu ...
- vue配置二级目录&vue-axios跨域办法&谷歌浏览器设置跨域
一.根据官方建议,dist打包的项目文件放在服务器根目录下,但是很多时候,我们并不能这样做,当涉及到二级目录设置多层深埋的时候,就需要在webpack配置文件里去设置一下了. 在webpack.con ...
- ubuntu sublime text 3 集成 nodejs 插件
下载nodejs插件地址:https://github.com/tanepiper/SublimeText-Nodejs 解压重命名文件夹为Nodejs打开sublime text : prefere ...
- Java 基础总结大全
Java 基础总结大全 一.基础知识 1.JVM.JRE和JDK的区别 JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jv ...