传送门

概率dp好题啊。

用f[i]" role="presentation" style="position: relative;">f[i]f[i]表示i自己不亮并且子树中的节点不会让i亮的概率。

用g[i]" role="presentation" style="position: relative;">g[i]g[i]表示i的子树以外的连通块不会使i变亮的概率。

貌似f[i]" role="presentation" style="position: relative;">f[i]f[i]可以直接推出来啊:

f[i]=(1−q[i])∗∏v(f[v]+(1−f[v])∗(1−dis[i,v]))" role="presentation" style="position: relative;">f[i]=(1−q[i])∗∏v(f[v]+(1−f[v])∗(1−dis[i,v]))f[i]=(1−q[i])∗∏v(f[v]+(1−f[v])∗(1−dis[i,v]))。

g[i]" role="presentation" style="position: relative;">g[i]g[i]感觉有点难推啊。

有个坑点是我们在推g[i]的时候已经自动默认i为根的子树没亮了,因此要除一个f[i]。

然后就没啥了。

我们设一个临时变量tmp。

tmp=g[fa[i]]∗f[fa[i]]/(f[i]+(1−f[i])∗(1−dis[fa[i],i]))" role="presentation" style="position: relative;">tmp=g[fa[i]]∗f[fa[i]]/(f[i]+(1−f[i])∗(1−dis[fa[i],i]))tmp=g[fa[i]]∗f[fa[i]]/(f[i]+(1−f[i])∗(1−dis[fa[i],i]))

g[i]=tmp+(1−tmp)∗(1−dis[fa[i],i])" role="presentation" style="position: relative;">g[i]=tmp+(1−tmp)∗(1−dis[fa[i],i])g[i]=tmp+(1−tmp)∗(1−dis[fa[i],i])

代码:

#include<bits/stdc++.h>
#define N 500005
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int n,first[N],cnt=0;
double p[N],f[N],g[N];
struct edge{int v,next;double w;}e[N<<1];
inline void add(int u,int v,double w){e[++cnt].v=v,e[cnt].next=first[u],e[cnt].w=w,first[u]=cnt;}
inline void dfs1(int x,int fa){
    f[x]=1-p[x];
    for(int i=first[x];i;i=e[i].next){
        int v=e[i].v;
        if(v==fa)continue;
        dfs1(v,x),f[x]*=f[v]+(1-f[v])*(1-e[i].w);
    }
}
inline void dfs2(int x,int fa){
    if(x==1)g[x]=1;
    for(int i=first[x];i;i=e[i].next){
        int v=e[i].v;
        if(v==fa)continue;
        double tmp=g[x]*f[x]/(f[v]+(1-f[v])*(1-e[i].w));
        g[v]=tmp+(1-tmp)*(1-e[i].w);
        dfs2(v,x);
    }
}
int main(){
    n=read();
    for(int i=1;i<n;++i){
        int u=read(),v=read();
        double w=read()*1.0/100;
        add(u,v,w),add(v,u,w);
    }
    for(int i=1;i<=n;++i)p[i]=read()*1.0/100;
    dfs1(1,0),dfs2(1,0);
    double ans=0;
    for(int i=1;i<=n;++i)ans+=1-g[i]*f[i];
    printf("%.6lf",ans);
    return 0;
}

2018.08.31 bzoj3566: [SHOI2014]概率充电器(概率dp+容斥原理)的更多相关文章

  1. 2018.08.31 bzoj1426 收集邮票(期望dp)

    描述 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且 买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮票,所以 ...

  2. 洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP

    洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP 题目描述 著名的电子产品品牌\(SHOI\) 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米 ...

  3. BZOJ3566 [SHOI2014]概率充电器 (树形DP&概率DP)

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

  4. BZOJ3566:[SHOI2014]概率充电器(树形DP,概率期望)

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

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

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

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

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

  7. [BZOJ3566][SHOI2014]概率充电器(概率DP)

    题意:树上每个点有概率有电,每条边有概率导电,求每个点能被通到电的概率. 较为套路但不好想的概率DP. 树形DP肯定先只考虑子树,自然的想法是f[i]表示i在只考虑i子树时,能有电的概率,但发现无法转 ...

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

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

  9. luoguP4284 [SHOI2014]概率充电器 概率期望树形DP

    这是一道告诉我概率没有想象中那么难的题..... 首先,用期望的线性性质,那么答案为所有点有电的概率和 发现一个点的有电的概率来源形成了一个"或"关系,在概率中,这并不好计算... ...

随机推荐

  1. leetcode202

    public class Solution { private int SumSqares(int n) { //将一个数字的各个数位的值分开存储 var list = new List<int ...

  2. VB6 MsgBox 函数

    在对话框中显示消息,等待用户单击按钮,并返回一个值指示用户单击的按钮. MsgBox(prompt[, buttons][, title][, helpfile, context]) 参数 promp ...

  3. Asp.Net MVC参考资料

    Every day up!!!!!! 1.无废话MVC入门教程 2.MVC快速入门 3.MVC小牛之路 4.Web API强势入门指南 5.全网最全的mvc汇总 6.MVC5+EF6+Bootstra ...

  4. ng2-file-upload 使用记录

    最近这两周一直在修bug,修的很是痛苦,不过痛苦也是件好事,不然每天都是在做同样的事情,没有什么挑战,工作多无聊呀! 是吧. 大致说一下背景吧: 这个项目是两年前开新项目,到现在一直还在开发中,一直不 ...

  5. Recursion递归

    /*java.lang 核心包 如 String Math Integer System Thread等 拿来直接用 * java.awt 窗口工具 GUI * java.net 网络包 * java ...

  6. Containerpilot 配置文件示例

    { consul: "localhost:8500", logging: { level: "INFO", format: "default" ...

  7. java script btoa与atob的

    javascript原生的api本来就支持,Base64,但是由于之前的javascript局限性,导致Base64基本中看不中用.当前html5标准正式化之际,Base64将有较大的转型空间,对于H ...

  8. select top 变量问题

    1.拼接查询语句(SQL2000,2005,2008均可) DECLARE @a AS INT SET @a=1 EXEC('SELECT TOP '+@a+' * FROM mtrcLanguage ...

  9. javascript,排列组合

    输入参数 ‘abc',输出所有组合 ['abc','acb','bac','bca','cab','cba'] 思路:分为3列,第一列为  a, b,c :第二列为a,b,c出去第一列选中过后的,比如 ...

  10. PS切图导出代码后出现的图片布局散乱的解决方法——table布局

    前言: 一般来说,大部分美工PS切图后导出的都是使用PS默认的table布局的页面,出现最多的异常是上传代码,替换图片后,发现图片布局散乱,完全不是想要的效果.轻微的是浏览器不兼容,只有部分浏览器可以 ...