题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=3566
题解:

概率dp,树形dp
如果求出每个点被通电的概率t,
那么期望答案就是t1×1+t2×1+t3*1+...+tn×1
现在问题就是要去求每个点被通电的概率。
因为是一颗树,所以每个点是否通电只由三个因素决定:
自己给自己通电;儿子给自己通电;父亲给自己通电。
这里采取求反面的方法:
对于每个点u,
1.求出u所在的子树不能给u点通电的概率f[u]。
2.求出u的父亲不能给u点通电的概率g[u]。
那么最终,每个点可以被通电的概率就是1-f[u]*g[u].
对于f[u]的求法:
dfs这颗树,用儿子v去更新父亲节点u:
$$f[u]=(1-q[u])\times \prod_{u->v:p(边的概率为p)}(f[v]+(1-f[v])*(1-p))$$
对于g[u]的求法:
同样的dfs这颗树,用父亲u去更新儿子节点v
先求出除了v之外,其他的点使得u通电的概率:t=f[u]*g[u]/(f[v]+(1-f[v])*(1-p));
(就是除掉儿子对父亲的贡献,注意(f[v]+(1-f[v])*(1-p))等于0的情况)
然后$$g[v]=t+(1-t)\times (1-p)$$

然后计算答案即可。

代码:

#include<bits/stdc++.h>
#define MAXN 500005
using namespace std;
const double eps=1e-9;
int dcmp(double x){
if(fabs(x)<eps) return 0;
return x>0?1:0;
}
struct Edge{
int ent; double p[MAXN*2];
int to[MAXN*2],nxt[MAXN*2],head[MAXN];
Edge(){ent=2;}
void Adde(int u,int v,int w){
to[ent]=v; p[ent]=1.0*w/100;
nxt[ent]=head[u]; head[u]=ent++;
}
}E;
double f[MAXN],g[MAXN],q[MAXN],ANS;
int N;
void dfs1(int u,int dad){
f[u]=(1-q[u]);
for(int e=E.head[u];e;e=E.nxt[e]){
int v=E.to[e]; if(v==dad) continue;
dfs1(v,u);
f[u]*=(f[v]+(1-f[v])*(1-E.p[e]));
}
}
void dfs2(int u,int dad){
double t;
for(int e=E.head[u];e;e=E.nxt[e]){
int v=E.to[e]; if(v==dad) continue;
if(dcmp(f[v]+(1-f[v])*(1-E.p[e]))!=0)
t=f[u]*g[u]/(f[v]+(1-f[v])*(1-E.p[e]));
else t=0;
g[v]=t+(1-t)*(1-E.p[e]);
dfs2(v,u);
}
}
int main(){
ios::sync_with_stdio(0);
cin>>N;
for(int i=1,a,b,c;i<N;i++)
cin>>a>>b>>c,E.Adde(a,b,c),E.Adde(b,a,c);
for(int i=1;i<=N;i++)
cin>>q[i],q[i]/=100;
g[1]=1;
dfs1(1,0);
dfs2(1,0);
for(int i=1;i<=N;i++)
ANS+=1-f[i]*g[i];
cout<<fixed<<setprecision(6)<<ANS<<endl;
return 0;
}

  

●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]概率充电器(概率DP 树形DP)

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Mybash的实现

    Mybash的实现 要求: 使用fork,exec,wait实现mybash 写出伪代码,产品代码和测试代码 发表知识理解,实现过程和问题解决的博客(包含代码托管链接) 背景知识 1. fork 使用 ...

  2. 团队作业6——展示博客(Alpha版本)

    Deadline: 2017-12-3  23:00PM,以博客发表日期为准   评分基准 按时交 - 有分,检查的项目包括后文的两个方面 团队成员介绍 Alpha阶段进展 团队合作,各成员分工 Be ...

  3. 【评分】集美大学软件工程1413班工程项目管理个人作业2——APP案例分析

    [评分]个人作业2--APP案例分析 作业要求 作业地址及完成情况 博文要求 通过分析你选中的产品,结合阅读<构建之法>,写一篇随笔,包含下述三个环节的所有要求. 第一部分 调研, 评测 ...

  4. 团队作业7——第二次项目冲刺(Beta版本12.10)

    项目每个成员的进展.存在问题.接下来两天的安排. 已完成的内容:头像功能原型设计.头像裁剪功能.头像上传功能.测试 计划完成的内容:头像功能测试.bug修复 每个人的工作 (有work item 的I ...

  5. nyoj 韩信点兵

    描述相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入3个非负整数a,b,c ,表示每种队形排尾的人数 ...

  6. REST or RPC?

    1 概念 1.1 RPC RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存 ...

  7. STM32读取温湿度传感器DHT11和DHT21(AM2301)系列问题

    1.DHT11和DHT21传感器 这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com). DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合 ...

  8. Spring源码阅读-spring启动

    web.xml web.xml中的spring容器配置 <listener> <listener-class>org.springframework.web.context.C ...

  9. 用javascript做别踩白块游戏1

    初学Javascript做的一个别踩白块小游戏,代码简陋,如下: <!DOCTYPE html> <html> <head> <!-- 禁用缩放功能 --&g ...

  10. emqtt 试用(七)追踪

    追踪 EMQ 消息服务器支持追踪来自某个客户端(Client)的全部报文,或者发布到某个主题(Topic)的全部消息. 追踪客户端(Client): ./bin/emqttd_ctl trace cl ...