题意:

给你n个节点的树,从1节点开始走,到每个节点都有三种情况,被杀死回到1节点,找到隐藏的出口出去,沿着当前节点相邻的边走到下一个节点,给出每个节点三种情况发生的概率分别为ki,ei,1-ki-ei,求找到出口时已经过的边数的期望。

分析:

用树状dp考虑问题。当节点是叶子节点时它只是向父节点走,非叶子节点可以向父亲节点和所有孩子节点走。

Ei表示到i节点经过边数的期望

则叶子节点:Ei=ki*E1+(1-ki-ei)*(E[par[i]]+1);//par[i]表示i的父亲节点

非叶子节点:Ei=ki*E1+(1-ki-ei)*(E[par[i]]/m+Σ(E[son[i]])/m+1)//m表示与i节点相连的边数,son[i]表示i节点孩子

接下来就是处理环了

令 Ei=ai*E1+bi*E[par[i]]+ci;//关键

叶子节点:ai=ki,bi=1-ki-ei,ci=1-ki-ei

非叶子节点:设j是i的孩子Σ(E[son[i]]=Σ(E[j])=Σai*E1+Σbi*Ei+Σci代入得

令 tmp=(1-ki-ei)*Σbi/m;

ai=(ki+(1-ki-ei)*Σai/m)/(1-tmp)

bi=(1-ki-ei)/(1-tmp)/m;

ci=((1-ki-ei)*Σci/m+1-ki-ei)/(1-tmp);

则E1=a1*E1+bi*0+ci可得答案,当tmp趋于1时无解

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
#define lson l,m,rt<<1
#define pi acos(-1.0)
#define rson m+1,r,rt<<11
#define exp 1e-9
#define All 1,N,1
#define N 10010
#define read freopen("in.txt", "r", stdin)
const ll INFll = 0x3f3f3f3f3f3f3f3fLL;
const int INF= 0x7ffffff;
const int mod = ;
int used[N],f,n;
double e[N],k[N],a[N],b[N],c[N];
vector<int>t[N];
void dfs(int u){
if(f)return;
used[u]=;
int num=t[u].size();
a[u]=k[u];
b[u]=(-k[u]-e[u])/num;
c[u]=-k[u]-e[u];
double tmp=;
for(int i=;i<num;++i){
int v=t[u][i];
if(used[v])continue;
dfs(v);
a[u]+=(-k[u]-e[u])/num*a[v];
tmp+=(-k[u]-e[u])/num*b[v];
c[u]+=(-k[u]-e[u])/num*c[v];
}
if(fabs(-tmp)<exp){
f=;
return;
}
a[u]/=(-tmp);
b[u]/=(-tmp);
c[u]/=(-tmp);
}
int main()
{
int test,cas=;
scanf("%d",&test);
while(test--){
scanf("%d",&n);
for(int i=;i<=n;++i)
t[i].clear();
int st,ed;
for(int i=;i<n-;++i){
scanf("%d%d",&st,&ed);
t[st].push_back(ed);
t[ed].push_back(st);
}
int kk,ee;
for(int i=;i<=n;++i){
scanf("%d%d",&kk,&ee);
k[i]=kk/100.0;
e[i]=ee/100.0;
}
memset(used,,sizeof(used));
f=;
dfs();
printf("Case %d: ",++cas);
if(!f&&(1.0-a[])>exp){
printf("%lf\n",c[]/(-a[]));
}
else{
printf("impossible\n");
}
}
return ;
}

HDU 4035Maze(树状+概率dp,绝对经典)的更多相关文章

  1. hdu 2227(树状数组+dp)

    Find the nondecreasing subsequences Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/3 ...

  2. hdu 4991(树状数组+DP)

    Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  3. hdu 4638 树状数组 区间内连续区间的个数(尽可能长)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  4. hdu 4777 树状数组+合数分解

    Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  5. 【bzoj4006】[JLOI2015]管道连接 斯坦纳树+状压dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的无向图和 $p$ 个特殊点,每个特殊点有一个颜色.要求选出若干条边,使得颜色相同的特殊点在同一个连通块内.输出最小边权和. 输入 第一行包含三个整数 n ...

  6. hdu 4622 Reincarnation trie树+树状数组/dp

    题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串. 连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 网上也有用后缀数组搞得. 思路 ...

  7. HDU 6348 序列计数 (树状数组 + DP)

    序列计数 Time Limit: 4500/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Subm ...

  8. 2018 CCPC网络赛 1010 hdu 6447 ( 树状数组优化dp)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 思路:很容易推得dp转移公式:dp[i][j] = max(dp[i][j-1],dp[i-1][j ...

  9. 【树状数组+dp】HDU 5542 The Battle of Chibi

    http://acm.hdu.edu.cn/showproblem.php?pid=5542 [题意] 给定长为n的序列,问有多少个长为m的严格上升子序列? [思路] dp[i][j]表示以a[i]结 ...

随机推荐

  1. sun.misc.unsafe类的使用

    http://blog.csdn.net/fenglibing/article/details/17138079

  2. ZOJ 1642 Match for Bonus (DP)

    题目链接 题意 : 给你两个字符串,两个字符串都有共同的字母,给你每个字母的值,规则是,找出两个字符串中的共同的一个字母,然后这个字母的值就可以加到自己的分数上,但是这步操作之后,这两个字母及其之前的 ...

  3. lintcode:Coins in a Line 硬币排成线

    题目 硬币排成线 有 n 个硬币排成一条线.两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止.拿到最后一枚硬币的人获胜. 请判定 第一个玩家 是输还是赢? 样例 n = 1, 返回  ...

  4. Python图片转换成矩阵,矩阵数据转换成图片

    # coding=gbk from PIL import Image import numpy as np # import scipy def loadImage(): # 读取图片 im = Im ...

  5. Python 中的 TK编程

    可爱的 Python:Python 中的 TK编程 http://www.ibm.com/developerworks/cn/linux/sdk/python/charm-12/ python che ...

  6. 10 harsh truths that will help you grow

    10 harsh truths that will help you grow帮你成长的10个残酷事实In the game of life, if it often seems like you’r ...

  7. Hibernate逍遥游记-第6章 通过Hibernate操纵对象(select-before-update)

    1. 2. 3. 4. 5. 6. 7.

  8. java:线程的简单控制方法

    中断线程方法 休眠:sleep(); 主动让出cpu:yield(); 设置线程优先级: 取值:getPriority(); 设置:setPriority(..); MAX_PRIORITY最大优先级 ...

  9. 控制CPU占用率曲线

    编程之美的第一个问题,我的机器是双核的,用文中的代码,得到的曲线波动比较大额,受其他进程的影响比较大.文中提到10ms接近windows的调度时间片,如果选得太小,会造成线程被频繁唤醒和挂起,造成内核 ...

  10. Linux 查看版本详情

    内核版本的信 uname -a -a选项表示察看所有的信息,但是从输出信息可以看出来,uname看到的版本信息,只是内核版本的信息,而不是发行版的版本信息 查看发行版信息 $cat /etc/issu ...