bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp
题意:给定一颗树,树上每个点通电概率为 $q[i]$%,每条边通电的概率为 $p[i]$%,求期望充入电的点的个数.
期望在任何时候都具有线性性,所以可以分别求每个点通电的概率(这种情况下期望=概率 $\times 1$ )然后累加.
然而,直接求通电的概率不是很好求,所以可以求不通电的概率,然后 $1$ 减去这个就是通电的概率了~
先假定以 $1$ 为根,令 $f[i]$ 表示仅考虑 $i$ 的子树及 $i$ 的影响时 $i$ 充不到电的概率.
则有: $f[i]=(1-q[i])\prod_{e\in(u,v)}(1-p[i]+p[i]f[i])$
而在 $i=1$ 时,$f[i]$ 就是 $1$ 号点不通电的概率,但是对于其余所有点,我们还需考虑父亲的影响:考虑换根dp
令 $g[i]$ 表示 $i$ 点的最终答案,即考虑所有情况下 $i$ 点不通电的概率.
那么,当 $i=1$ 时,$g[1]=f[1]$
而 $i\neq1$ 时,令 $p$ 表示只考虑父亲对 $i$ 的影响,而 $p=\frac{g[fa]}{1-p[e]+p[e]f[i]}$ $e$ 为 $i$ 到 $fa$ 的边.
则有 $g[i]=f[i]\times (1-p[e]+p[e]\times p)$
求完之后再累加一下即可.
#include <bits/stdc++.h>
#define N 500002
#define LL long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n,edges;
double f[N],g[N],perc[N<<1],q[N];
int hd[N],to[N<<1],nex[N<<1];
void add(int u,int v,double c)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,perc[edges]=c;
}
void dfs1(int u,int ff)
{
f[u]=1-q[u];
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(v==ff) continue;
dfs1(v,u);
f[u]*=(1-perc[i]+perc[i]*f[v]);
}
}
void dfs2(int u,int ff,int j)
{
if(u==1) g[u]=f[u];
else
{
double p=g[ff]/(1-perc[j]+perc[j]*f[u]);
g[u]=f[u]*(1-perc[j]+perc[j]*p);
}
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(v==ff) continue;
dfs2(v,u,i);
}
}
int main()
{
// setIO("input");
int i,j;
scanf("%d",&n);
for(i=1;i<n;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z),add(x,y,(double)z/100),add(y,x,(double)z/100);
}
for(i=1;i<=n;++i) scanf("%lf",&q[i]), q[i]/=100;
dfs1(1,0);
dfs2(1,0,0);
double ans=0;
for(i=1;i<=n;++i) ans+=1.0-g[i];
printf("%.6lf",ans);
return 0;
}
bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp的更多相关文章
- BZOJ 3566: [SHOI2014]概率充电器( 树形dp )
通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节 ...
- BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]
3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...
- bzoj 3566: [SHOI2014]概率充电器
Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器:"采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率 ...
- BZOJ 3566 [SHOI2014]概率充电器 ——期望DP
期望DP. 补集转化,考虑不能被点亮的情况, 然后就是三种情况,自己不能亮,父亲不能点亮它,儿子不能点亮它. 第一次计算比较容易,第二次计算的时候需要出去第一次的影响,因为一条线只能传导一次 #inc ...
- ●BZOJ 3566 [SHOI2014]概率充电器
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3566题解: 概率dp,树形dp 如果求出每个点被通电的概率t, 那么期望答案就是t1×1+t ...
- BZOJ.3566.[SHOI2014]概率充电器(概率DP 树形DP)
BZOJ 洛谷 这里写的不错,虽然基本还是自己看转移... 每个点的贡献都是\(1\),所以直接求每个点通电的概率\(F_i\),答案就是\(\sum F_i\). 把\(F_x\)分成:父节点通电给 ...
- bzoj 3566 [SHOI2014]概率充电器——树型
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3566 一眼看上去高斯消元.n^3不行. 竟然直接去看了TJ.发现树型dp.一下想到了自己还没 ...
- bzoj 3566: [SHOI2014]概率充电器【树形概率dp】
设g[u]为这个点被儿子和自己充上电的概率,f[u]为被儿子.父亲和自己充上电的概率 然后根据贝叶斯公式(好像是叫这个),1.P(A+B)=P(A)+P(B)-P(A)*P(B),2.P(A)=(P( ...
- 【BZOJ 3566】 3566: [SHOI2014]概率充电器 (概率树形DP)
3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...
随机推荐
- 函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!闭包访问局部变量
函数内部声明变量的时候,一定要使用var命令.如果不用的话,你实际上声明了一个全局变量! function f1(){ n=999; } f1(); alert(n); 子函数可以一层一层读取到父元素 ...
- 【转】使用Dockerfile构建镜像并push到私有仓库
环境:OS X 10.10.5 maven 3.3.9 Docker version 1.12.2 docker-machine version 0.8.2 程序示例为http://www.cnblo ...
- ubuntu classicmenu-indicator
sudo add-apt-repository ppa:diesch/testing sudo apt-get update sudo apt-get install classicmenu-in ...
- .net 调用存储过程
语言:C# 一.调用带输入参数的存储过程 首先自然是在查询分析器里创建一个存储过程喽~~ 如下所示: create proc proc_1 @uid int, @pwd varchar(255) ...
- Math对象的一些方法
ceil(n) 返回n向上取整的最近的整数floor(n) 返回n向下取整到最近的整数max(a,b,c...) 返回最大值min(a,b,c...) 返回最小值round(n) 返回n四舍五入的最近 ...
- Part_five:Redis哨兵高可用
redis哨兵高可用 1.redis-sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案, 当用redis作master-slave的高可用时,如果master本身宕 ...
- JavaScript:将key和value不带双引号的JSON字符串转换成JSON对象的方法
遇到相关的问题,花了两天的时间来解决,深感来之不易,所以做如下的总结,希望遇到此问题的码农能更快的找到解决办法! var jsonArr= [{col:TO_CHAR(HZRQ,'YYYYMM'),t ...
- Restful api 返回值重复的问题
Spring boot全家桶前后端分离的项目,在扩充某一个列表形式的返回值时,发现返回值出现了一批的重复. 正常的数据返回: 数值完全一致只是参数名称区分了大小写,如下图: 推测可能是restful格 ...
- linux下安装grpc插件 (c++和go语言)
在debian/ubuntu系统下,需要做如下准备操作: $ [sudo] apt-get install build-essential autoconf libtool pkg-config 如果 ...
- 如何顺利完成Kubernetes源码编译?
为什么要编译源码 ? Kubernetes是一个非常棒的容器集群管理平台.通常情况下,我们并不需要修改K8S代码即可直接使用.但如果,我们在环境中发现了某个问题/缺陷,或按照特定业务需求需要修改K8S ...