【算法】树型DP+期望DP

【题意】一棵树上每个点均有直接充电概率qi%,每条边有导电概率pi%,问期望有多少结点处于充电状态?

【题解】引用自:【BZOJ3566】【SHOI2014】概率充电器 树形DP 概率DP by 空灰冰魂

最大的难点在于计算每个点充电期望时,两个节点各自的期望都会影响对方的期望。

所以考虑转化对象,改为求每个节点充不上电的期望,充不上电就不用考虑两者的相互影响。

fi表示结点i由子结点和自身充不上电的概率

gi表示结点i由父结点充不上电的概率

第一次DFS

hi表示结点i对父亲贡献的概率

fi=(1-qi)*∏h[son[i]]

hi=fi+(1-fi)*(1-pi)  pi为i到父亲的导线通电概率

☆两者发生其一用概率加法,多者都必须发生用概率乘法,P(A+B)=P(A)+P(B)-P(AB)注意去除交集。

第二次DFS

当前结点x,父亲结点y。

t表示父亲y对结点x的贡献。

t=gy*(fy/hx)  注意hx为0的情况(除0)

gx=t+(1-t)*(1-pi)  pi为x到y的导线概率

最终答案:ans=Σ(1-fi*gi)  因为概率和期望都是0~1,所以一样。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
struct edge{int v,from;double p;}e[maxn*];
int n,first[maxn],tot;
double q[maxn],f[maxn],g[maxn],h[maxn],fw[maxn];
void insert(int u,int v,double w)
{tot++;e[tot].v=v;e[tot].p=w;e[tot].from=first[u];first[u]=tot;}
void dfs1(int x,int fa)
{
f[x]=-q[x];
for(int i=first[x];i;i=e[i].from)if(e[i].v!=fa)
{
dfs1(e[i].v,x);
f[x]*=h[e[i].v];
}else fw[x]=e[i].p;
h[x]=f[x]+(-f[x])*(-fw[x]);
}
void dfs2(int x,int y)
{
double t;
if(!h[x])t=;else t=g[y]*f[y]/h[x];
g[x]=t+(-t)*(-fw[x]);
for(int i=first[x];i;i=e[i].from)if(e[i].v!=y)dfs2(e[i].v,x);
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
insert(u,v,1.0*w/);
insert(v,u,1.0*w/);
}
for(int i=;i<=n;i++){int u;scanf("%d",&u);q[i]=1.0*u/;}
dfs1(,);
dfs2(,);
double ans=;
for(int i=;i<=n;i++)ans+=-f[i]*g[i];
printf("%.6lf",ans);
return ;
}

【BZOJ】3566: [SHOI2014]概率充电器的更多相关文章

  1. BZOJ 3566: [SHOI2014]概率充电器( 树形dp )

    通过一次dfs求出dp(x)表示节点x考虑了x和x的子树都没成功充电的概率, dp(x) = (1-p[x])π(1 - (1-dp[son])*P(edge(x, son)).然后再dfs一次考虑节 ...

  2. BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]

    3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...

  3. bzoj 3566: [SHOI2014]概率充电器

    Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器:"采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率 ...

  4. ●BZOJ 3566 [SHOI2014]概率充电器

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3566题解: 概率dp,树形dp 如果求出每个点被通电的概率t, 那么期望答案就是t1×1+t ...

  5. BZOJ.3566.[SHOI2014]概率充电器(概率DP 树形DP)

    BZOJ 洛谷 这里写的不错,虽然基本还是自己看转移... 每个点的贡献都是\(1\),所以直接求每个点通电的概率\(F_i\),答案就是\(\sum F_i\). 把\(F_x\)分成:父节点通电给 ...

  6. bzoj 3566 [SHOI2014]概率充电器——树型

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3566 一眼看上去高斯消元.n^3不行. 竟然直接去看了TJ.发现树型dp.一下想到了自己还没 ...

  7. bzoj 3566: [SHOI2014]概率充电器【树形概率dp】

    设g[u]为这个点被儿子和自己充上电的概率,f[u]为被儿子.父亲和自己充上电的概率 然后根据贝叶斯公式(好像是叫这个),1.P(A+B)=P(A)+P(B)-P(A)*P(B),2.P(A)=(P( ...

  8. bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp

    题意:给定一颗树,树上每个点通电概率为 $q[i]$%,每条边通电的概率为 $p[i]$%,求期望充入电的点的个数. 期望在任何时候都具有线性性,所以可以分别求每个点通电的概率(这种情况下期望=概率 ...

  9. BZOJ 3566 [SHOI2014]概率充电器 ——期望DP

    期望DP. 补集转化,考虑不能被点亮的情况, 然后就是三种情况,自己不能亮,父亲不能点亮它,儿子不能点亮它. 第一次计算比较容易,第二次计算的时候需要出去第一次的影响,因为一条线只能传导一次 #inc ...

  10. 【BZOJ 3566】 3566: [SHOI2014]概率充电器 (概率树形DP)

    3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...

随机推荐

  1. Java微笔记(4)

    Java 中的内部类 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类 内部类的主要作用如下: 内部类提供了更好的封装,可以把内部类隐藏在外部类之 ...

  2. Java中ArrayList与数组间相互转换

    在实际的 Java 开发中,如何选择数据结构是一个非常重要的问题. 衡量标准化(读的效率与改的效率) : ① Array: 读快改慢 ② Linked :改快读慢 ③ Hash:介于两者之间 实现Li ...

  3. 《剑指offer》---字符串的全排列

    本文算法使用python3实现 1.问题一 1.1 题目描述:   输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc ...

  4. Css入门课程 Css基础

    html css javascript三者关系 html是网页内容的载体 css是网页内容的表现,外观控制 javascript是网页逻辑处理和行为控制 css相对于html标签属性的优势 css简化 ...

  5. SpringData——HelloWorld

    1.背景 最开始了解SpringData的时候,以为他不就是ORM的一种实现方式嘛,还能有什么新的东西.从hibernate到ibatis.mybatis,也许他只不过是spring想整合一个更方便的 ...

  6. CentOs7.3 搭建 Redis-4.0.1 Cluster 集群服务

    环境 VMware版本号:12.0.0 CentOS版本:CentOS 7.3.1611 三台虚拟机(IP):192.168.252.101,192.168.102..102,192.168.252. ...

  7. mysql表、函数等被锁住无响应的问题

    场景: 在对表或函数等进行操作的时候,如果出现无法响应的情况(排除外网的网络问题),此时极有可能被某一个线程锁定了(这是函数的情况,表的话可能是被某一个用户锁定了),锁定的原因一般都是死循环出不来,而 ...

  8. array to object

    array to object native js & ES6 https://stackoverflow.com/questions/4215737/convert-array-to-obj ...

  9. lambda 分组练习

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } List<Person> per ...

  10. 【bzoj5110】[CodePlus2017]Yazid 的新生舞会 Treap

    题目描述 求一个序列所有的子区间,满足区间众数的出现次数大于区间长度的一半. 输入 第一行2个用空格隔开的非负整数n,type,表示序列的长度和数据类型.数据类型的作用将在子任务中说明. 第二行n个用 ...