HDU 4035

 dp求期望的题。
    设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望。E[1]即为所求。
    叶子结点:
    E[i] = ki*E[1] + ei*0 + (1-ki-ei)*(E[father[i]] + 1);
         = 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则无解...

经典DP期望了。以上是题解了,其实这道题是最开始做的,所以后来才会用那种设系数的方法。一直留到现在才写,自己重新推了一遍,感觉这种设系数然后递推系数的方法实在妙极啊。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 10010

struct ed{
	int u,v;
	int next;
}edge[N*2];
int head[N];

struct nd{
	double k,e;
}node[N];
int tot,n;
double A[N],B[N],C[N];

void addedge(int u,int v){
	edge[tot].u=u;
	edge[tot].v=v;
	edge[tot].next=head[u];
	head[u]=tot++;
}

void dfs(int parent,int now){
	bool leaf=true;
	double tcA,tcB,tcC;
	tcA=tcB=tcC=0;
	int cnt=0;
	double ki=node[now].k;
	double ei=node[now].e;
	for(int e=head[now];e!=-1;e=edge[e].next){
		cnt++;
		if(edge[e].v!=parent){
			leaf=false;
			dfs(now,edge[e].v);
			tcA+=A[edge[e].v];
			tcB+=B[edge[e].v];
			tcC+=C[edge[e].v];
		}
	}
	if(leaf){
		A[now]=ki;
		B[now]=1-ki-ei;
		C[now]=1-ki-ei;
	}
	else{
		A[now]=(ki+tcA*(1-ki-ei)/cnt)/(1-tcB*(1-ki-ei)/cnt);
		B[now]=(1-ki-ei)/cnt/(1-tcB*(1-ki-ei)/cnt);
		C[now]=(tcC*(1-ki-ei)/cnt+(1-ki-ei))/(1-tcB*(1-ki-ei)/cnt);
	}
}

int main(){
	int T,u,v,kase=0;
	double k,e;
	scanf("%d",&T);
	while(T--){
		scanf("%d",&n);
		for(int i=1;i<=n;i++){
			head[i]=-1;
			A[i]=B[i]=C[i]=0;
		}
		tot=0;
		for(int i=1;i<n;i++){
			scanf("%d%d",&u,&v);
			addedge(u,v);
			addedge(v,u);
		}
		for(int i=1;i<=n;i++){
			scanf("%lf%lf",&k,&e);
			node[i].k=k/100;
			node[i].e=e/100;
		}
		dfs(0,1);
		double ans=(C[1])/(1-A[1]);
		if(fabs(1-A[1])<1e-9)   //必须是-9。。。跪了。。
		printf("Case %d: impossible\n",++kase);
		else{
			printf("Case %d: %.6lf\n",++kase,ans);
		}
	}
	return 0;
}

  

时间: 2024-11-09 08:48:30

HDU 4035的相关文章

hdu 4035 2011成都赛区网络赛E 概率dp ****

太吊了,反正我不会 1 /* 2 HDU 4035 3 4 dp求期望的题. 5 题意: 6 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 7 从结点1出发,开始走,在每个结点i都有3种可能: 8 1.被杀死,回到结点1处(概率为ki) 9 2.找到出口,走出迷宫 (概率为ei) 10 3.和该点相连有m条边,随机走一条 11 求:走出迷宫所要走的边数的期望值. 12 13 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 14 15 叶子结点: 16

hdu 4035 概率dp

太吊了 1 /* 2 HDU 4035 3 4 dp求期望的题. 5 题意: 6 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 7 从结点1出发,开始走,在每个结点i都有3种可能: 8 1.被杀死,回到结点1处(概率为ki) 9 2.找到出口,走出迷宫 (概率为ei) 10 3.和该点相连有m条边,随机走一条 11 求:走出迷宫所要走的边数的期望值. 12 13 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 14 15 叶子结点: 16 E[i] =

HDU 4035:Maze 概率DP求期望(有环)

Maze 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意: 有N(2 ≤ N ≤ 10000)个房间和一堆双向边(不存在环),每个房间有ki和ei两个值,分别代表回到房间1和游戏结束的概率,求游戏结束时通过的边数的期望 题解: 一道很好很经典的求期望的题 设E[i]为以i为起点,直到游戏结束所通过边数的期望,则E[1]即所求答案 设fa代表父亲节点(由于不存在环,则图为一棵树,设1为根节点),∑ch代表所有孩子节点,size代表与这

HDU 4035 Maze(树形概率DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:一棵树,从结点1出发,在每个结点 i 都有3种可能:(1)回到结点1 , 概率 Ki:(2)结束,概率 Ei:(3)随机走一条边.(ki+ei+随机走=1) 求到结束需要走的边数的期望. 假设E[i]为点i到结束走边数的期望,则有 (以下m为点的度数) E[i]=ki*E[1]+(1-ei-ki)/m*(E[fa[i]]+1)若i为叶子节点. =ki*E(1)+(1-ki-ei)*E(f

【概率与期望】hdu 4035

通道:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树,从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 (概率为ei) 3.和该点相连有m条边,随机走一条 求走出迷宫所要走的边数的期望值. 思路: 设 E[i]表示在结点i处,要走出迷宫所要走的边数的期望.E[1]即为所求. 叶子结点: E[i] = ki*E[1] + ei

hdu 4035 概率DP 成都网赛

http://acm.hdu.edu.cn/showproblem.php?pid=4035 学到: 1.先判断是不是树,其实凡是有图的感觉的,都看边数==点数-1是不是成立 2.树有时候区分老子跟孩子还是有必要的,这道题就是,不过是在dfs的时候,传参数的时候多加个表示父节点的参数而已 3.一定注意,概率DP对精度真的要求很高 开始的时候写1e-8,WA了好几发,改了1e-10  AC 4.注意分母为0的可能的时候加上判断 讲的很详细的题解:http://blog.csdn.net/morga

hdu 4035 可能性DP 成都网络游戏

http://acm.hdu.edu.cn/showproblem.php?pid=4035 获得: 1.首先推断是不是树.事实上,所有的感觉身影,既看边数==算-1是不成立 2.有时候,我告诉孩子来区分树仍然是必要的,就是,只是是在dfs的时候,传參数的时候多加个表示父节点的參数而已 3.一定注意,概率DP对精度真的要求非常高 開始的时候写1e-8,WA了好几发,改了1e-10  AC 4.注意分母为0的可能的时候加上推断 讲的非常具体的题解:http://blog.csdn.net/morg

HDU 4035:Maze(概率DP)

http://acm.split.hdu.edu.cn/showproblem.php?pid=4035 Maze 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

hdu 4035 Maze(期望)

http://acm.hdu.edu.cn/showproblem.php?pid=4035 是一道很好的题目.题意是有一个迷宫,这里有n个房间,每一对房间有且只有一条隧道,一共有n-1条隧道.起初他在1号房间.他若当前在房间i,接下来有三种路径可以走:ki的概率被杀掉直接回到1号房间:ei的概率从该房间逃走,否则它有均等的概率通过隧道走到和i号房间相连的房间.问它从1号房间逃出去要走的隧道数目的期望. 设dp[i]表示在i号房间走出去要通过的隧道的期望,n-1条边将房间连成一颗无根树,对于叶子

HDU 4035 Maze 概率dp 难度:2

http://acm.hdu.edu.cn/showproblem.php?pid=4035 求步数期望,设E[i]为在编号为i的节点时还需要走的步数,father为dfs树中该节点的父节点,son为dfs树种该节点的子节点的集合,kl[i]为被杀掉的概率,ex[i]为逃出的概率 mv[i]=(1-kl[i]-ex[i])/(1+len(son)) 则明显 E[i]=(E[father]+1)*mv[i]+sigma((E[son]+1)*mv[i])+E[1]*K[i] 未知量是E[i],E[