题面

题目传送门

分析

定义f(i)f(i)f(i)为iii点不被点亮的概率,p(i)p(i)p(i)为iii自己被点亮的概率,p(i,j)p(i,j)p(i,j)表示i−ji-ji−j

这条边联通的概率,有f(i)=(1−p(i))∗∏i−j(  1−p(i,j)∗(1−f(j))  )\large f(i)=(1-p(i))*\prod_{i-j}(\ \ 1-p(i,j)*(1-f(j))\ \ )f(i)=(1−p(i))∗i−j∏​(  1−p(i,j)∗(1−f(j))  )

可以看出,对于一个点iii,所有于它相连的点对它的影响是独立的,那么我们首先以111为根,只考虑儿子的影响做一次树形DPDPDP。然后再进行第二次DPDPDP,只考虑父亲的影响,具体做法只需要将父亲的f(fa)f(fa)f(fa)除以iii带来的影响就得到fafafa对iii的影响。见代码

CODE

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500005;
int n, fir[MAXN], cnt;
double p[MAXN];
struct edge {
int to, nxt;
double p;
}e[MAXN<<1];
inline void add(int u, int v, double wt) {
e[++cnt] = (edge){v, fir[u], wt}; fir[u] = cnt;
e[++cnt] = (edge){u, fir[v], wt}; fir[v] = cnt;
}
double dp[MAXN];
inline void dfs1(int u, int ff) {
dp[u] = 1-p[u];
for(int i = fir[u], v; i; i = e[i].nxt)
if((v=e[i].to) != ff) dfs1(v, u), dp[u] *= 1-(1-dp[v])*e[i].p;
}
inline void dfs2(int u, int ff) {
for(int i = fir[u], v; i; i = e[i].nxt) {
if((v=e[i].to) != ff) {
double tmp = 1 - (dp[u] ? dp[u]/(1-(1-dp[v])*e[i].p) : 0); //为了不除0
dp[v] *= 1 - tmp*e[i].p;
dfs2(v, u);
}
}
}
int main () {
scanf("%d", &n);
for(int i = 1, x, y, z; i < n; ++i)
scanf("%d%d%d", &x, &y, &z), add(x, y, (double)z/100);
for(int i = 1, x; i <= n; ++i)
scanf("%d", &x), p[i] = (double)x/100;
dfs1(1, 0);
dfs2(1, 0);
double ans = 0;
for(int i = 1; i <= n; ++i)
ans += 1-dp[i];
printf("%.6f\n", ans);
}

关于在第二次dfsdfsdfs时的除法可能会除以零,是这样考虑的

  • 若分母出现000,则说明dp[u]dp[u]dp[u]也一定是000,因为dp[u]dp[u]dp[u]在第一次dfsdfsdfs时本来就乘上了分母。那么此时tmp=1tmp=1tmp=1,也就是代表父亲一定会被点亮。
  • 所以就判断一下dp[u]dp[u]dp[u]是否为000,再做除法就行了。

EOF\Large EOFEOF

BZOJ 3566 概率充电器(树形概率DP)的更多相关文章

  1. BZOJ3566: [SHOI2014]概率充电器 树形+概率dp

    3566: [SHOI2014]概率充电器 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1888  Solved: 857[Submit][Stat ...

  2. 【bzoj3566】[SHOI2014]概率充电器 树形概率dp

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

  3. BZOJ_3566_[SHOI2014]概率充电器_概率+树形DP

    BZOJ_3566_[SHOI2014]概率充电器_概率+树形DP Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技 ...

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

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

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

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

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

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

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

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

  8. luogu P4284 [SHOI2014]概率充电器 期望 概率 树形dp

    LINK:概率充电器 大概是一个比较水的题目 不过有一些坑点. 根据期望的线性性 可以直接计算每个元件的期望 累和即为答案. 考虑统计每一个元件的概率的话 那么对其有贡献就是儿子 父亲 以及自己. 自 ...

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

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

随机推荐

  1. react生成二维码

    图片实例: 简介: QRCode.js 是一个生成二维码的JS库.主要是通过获取 DOM 的节点,再通过 HTML5 Canvas 绘制而成,不依赖任何库. 用法: 1. 在项目中引入qrcode.m ...

  2. Snapshot Array

    Implement a SnapshotArray that supports the following interface: SnapshotArray(int length) initializ ...

  3. 路由器04--OPKG

    1.简介 https://oldwiki.archive.openwrt.org/doc/techref/opkg Opkg 是一个基于 ipkg 的轻量级的软件包管理系统,主要用于嵌入式系统,目前应 ...

  4. SrpingBoot入门到入坟01-HelloWorld和SpringBoot打Jar包

    第一个SpringBoot: 建立一个maven项目: 再pom.xml里面增加依赖: <?xml version="1.0" encoding="UTF-8&qu ...

  5. js 监听键盘的enter键

    // js 版本 window.onload=function(){ document.onkeydown=function(ev){ var event=ev ||event if(event.ke ...

  6. 中国5级行政区域MySQL数据库库

    爬取国家统计局官网的行政区域数据,包括省市县镇村5个层级,其中港澳地区的数据只有3级;台湾地区4级;包含大陆地区的邮政编码和经纬度信息. 行政划分的总体结构是: 省->市(州)->县(区) ...

  7. vue 2.0 + 如何实现加入购物车,小球飞入的动画

    github源码地址:https://github.com/13476075014/node-vue/tree/master/mynodeproject/13.sell/sell 在移动端经常会有加入 ...

  8. 图片预加载的插件使用-jquery.imgpreload.min.js

    使用方法: //图片预加载 var the_images = [];//新建一个数组,然后将要加载的图片地址推入这个数组中: the_images.push( 'bg.jpg' ); var load ...

  9. linux命令启动关闭firewalld防火墙,添加端口

    firewalld管理防火墙常用命令   1.查看防火墙的状态 [root@localhost HMK]# firewall-cmd --state 查看防火墙的运行状态 not running [r ...

  10. KVM之配置桥接网卡

    配置桥接网卡 添加桥接网卡br0,注释掉已有的eth0配置 [root@ubuntu01 ~]# vi /etc/network/interfaces # This file describes th ...