hdu4035之经典慨率DP

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




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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115355.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux服务器,卸载tensorflow CPU 安装PGU版

    linux服务器,卸载tensorflow CPU 安装PGU版linux服务器,卸载tensorflowCPU安装PGU版写在前面之前用的和学习的都是pytorch框架,现在要运行一个keras的代码,得安装tensorflow和keras,按一个教程,直接在pycharm里setting,点那个+很快就装好了tensorflow和keras,运行了几次发现运行特别慢,用nvidia-smi查看,发现根本没有用pgu跑,一番查找,最后发现安装的tensorflow本身是按CPU跑的,要用GPU跑,得安装tensorflow-gpu。以下主要参考了https

    2022年6月22日
  • 上海西门子培训-第二天(周一)

    上海西门子培训-第二天(周一)

    2021年7月22日
  • phpstorm mac激活码2021详解【2021.7最新】

    (phpstorm mac激活码2021详解)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlML…

    2022年3月21日
  • matlab多重比较lsd法,多重比较LSD-t值的计算(附证明方法)

    matlab多重比较lsd法,多重比较LSD-t值的计算(附证明方法)多重比较LSD-t值的计算问题的提出:向学术期刊投稿时,“变态”的审稿人向你“索要”LSD-t值,可是SPSS的输出结果中没有这个值——是不是有点悲催?!另外,大家还会有一个常见的疑问:采用LSD-t法进行两两比较之后得出来的p值,需不需要调整显著性水平?我们先把原始数据和答案给出来,然后再讲一讲其中的数理逻辑。本例使用的原始数据如下图所示,有兴趣的读者可以用本数据进行对照学习(本例采用单因素方差…

    2022年6月12日
  • PHP调用Webservice实例[通俗易懂]

    PHP调用Webservice实例[通俗易懂]NuSoap是PHP环境下的WebService编程工具,用于创建或调用WebService。它是一个开源软件,是完全采用PHP语言编写的、通过HTTP收发SOAP消息的一系列PHP类,由NuSphereCorporation(http://dietrich.ganx4.com/nusoap/)开发。NuSOAP的一个优势是不需要扩展库的支持,这种特性使得NuSoap可以用于所有的PHP环境,

    2022年7月21日
  • spgwr | R语言与地理加权回归(Ⅰ-1):线性地理加权回归[通俗易懂]

    spgwr | R语言与地理加权回归(Ⅰ-1):线性地理加权回归[通俗易懂]地理加权回归(GeographicallyWeightedRegression,GWR)经过多年发展,已经具备了多种形式,在R语言中也对应着多个工具包,其中spgwr是一个开发较早、…

    2022年9月27日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号