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

Problem Description
When wake up, lxhgww find himself in a huge maze.



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?
 
Input
First line is an integer T (T ≤ 30), the number of test cases.



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.
 
Output
For each test case, output one line “Case k: ”. k is the case id, then the expect number of tunnels lxhgww go through before he exit. The answer with relative error less than 0.0001 will get accepted. If it is not possible to escape from the maze, output “impossible”.
 
Sample Input
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
 
Sample Output
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的更多相关文章

  1. ZOJ3640之简单慨率DP

    Help Me Escape Time Limit: 2 Seconds      Memory Limit: 32768 KB Background     If thou doest well, ...

  2. Uva 10891 经典博弈区间DP

    经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...

  3. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  4. NYOJ90 整数划分(经典递归和dp)

    整数划分 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,  其中n1≥n2≥…≥nk≥1,k≥1.  正 ...

  5. hoj 2662 经典状压dp // MyFirst 状压dp

    题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. ...

  6. POJ 1185 经典状压dp

    做了很久的题 有注释 #include<stdio.h> #include<string.h> #include<algorithm> #include<ma ...

  7. hdu3534,个人认为很经典的树形dp

    题目大意为,求一个树的直径(最长路),以及直径的数量 朴素的dp只能找出某点开始的最长路径,但这个最长路径却不一定是树的直径,本弱先开始就想简单了,一直wa 直到我看了某位大牛的题解... 按照那位大 ...

  8. poj 2342 Anniversary party_经典树状dp

    题意:Ural大学有n个职员,1~N编号,他们有从属关系,就是说他们关系就像一棵树,父节点就是子节点的直接上司,每个职员有一个快乐指数,现在要开会,职员和职员的直接上司不能同时开会,问怎才能使开会的快 ...

  9. 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 ...

随机推荐

  1. maven实战系列

    Maven实战(一)安装和配置 Maven实战(二)构建简单Maven项目 Maven实战(三)Eclipse构建Maven项目 Maven实战(四)生命周期 Maven实战(五)坐标详解 Maven ...

  2. initialization 与 finalization 执行顺序 研究

    看GIF: 第二个GIF: DEMO下载:http://files.cnblogs.com/files/del88/InitOrderDemo.zip

  3. 观察者模式和java委托

    观察者模式与java委托 所谓观察者模式,指的某个状态信息的改变,会影响其他一系列的操作,这时就可以将这些操作抽象化,同时创建一个类统一的管理和执行这些操作.把这些抽象出来的操作称为观察者类,而管理这 ...

  4. 湖南大学ACM程序设计新生杯大赛(同步赛)D - Number

    题目描述 We define Shuaishuai-Number as a number which is the sum of a prime square(平方), prime cube(立方), ...

  5. 哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)I - B-旅行

    题目描述 小z放假了,准备到RRR城市旅行,其中这个城市有N个旅游景点.小z时间有限,只能在三个旅行景点进行游玩.小明租了辆车,司机很善良,说咱不计路程,只要你一次性缴费足够,我就带你走遍RRR城. ...

  6. Spring学习——什么是AOP

    在网上查找什么是AOP,查到了下面这段话,我感觉写得清晰明了,一下子就明白了什么是面向切面编程AOP. ———————————————————————————————————————————————— ...

  7. Java反射机制demo(一)—实例化Class对象,并获得其他类包名和类型

    Java反射机制demo(一)——实例化Class对象,通过对象获得包名和类型 使用Java中的 本地类作为实验对象,避免自定义的类带来的一些不便. public static void main(S ...

  8. bash shell 关系

    linux的bash和shell关系 shell通俗理解:把用户输入的命令翻译给操作系统. shell 是一个交互性命令解释器.shell独立于操作系统,这种设计让用户可以灵活选择适合自己的shell ...

  9. linux——(6)vim与vi

    概念:vi与vim的区别 vi是一款老式的文字处理软件,不过现在依然广泛使用,所有的UnixLike系统都会内置vi文本编辑器. vim可以看出vi的升级版,不过vi更像是一个程序开发工具,功能也比v ...

  10. AFF镜像工具集afflib-tools

    AFF镜像工具集afflib-tools   Advanced Forensic Format(AFF)是一种开源免费的磁盘镜像格式.作为磁盘数字取证的三大格式之一,AFF提供数字取证的各项功能,如签 ...