●BZOJ 3566 [SHOI2014]概率充电器
题链:
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]概率充电器的更多相关文章
- 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)
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: [SHOI2014]概率充电器 数学期望+换根dp
题意:给定一颗树,树上每个点通电概率为 $q[i]$%,每条边通电的概率为 $p[i]$%,求期望充入电的点的个数. 期望在任何时候都具有线性性,所以可以分别求每个点通电的概率(这种情况下期望=概率 ...
- BZOJ 3566 [SHOI2014]概率充电器 ——期望DP
期望DP. 补集转化,考虑不能被点亮的情况, 然后就是三种情况,自己不能亮,父亲不能点亮它,儿子不能点亮它. 第一次计算比较容易,第二次计算的时候需要出去第一次的影响,因为一条线只能传导一次 #inc ...
- 【BZOJ 3566】 3566: [SHOI2014]概率充电器 (概率树形DP)
3566: [SHOI2014]概率充电器 Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:“采用全新纳米级加工技术,实现元件与导线能否通电 ...
随机推荐
- beta冲刺7-咸鱼
前言:最后一篇惹.明天就是正式交差了.有点慌-- 昨天的未完成: 用户试用+测评 输入部分的正则式判定 今天的工作: 登陆界面修改 我的社团显示效果优化 部分信息注册后锁定无法修改 其他部分功能优化 ...
- 转:运行page页面时的事件执行顺序及页面的回发与否深度了解
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...
- formidable 表单文件和数据提交
只要涉及文件上传,那么form标签要加一个属性: <form action="http://127.0.0.1/dopost" method="post" ...
- 个人技术博客(alpha)
APP的权限校验不同于web网页端,web一般使用session记录用户的状态信息,而app则使用token令牌来记录用户信息.有这样一个场景,系统的数据量达到千万级,需要几台服务器部署,当一个用户在 ...
- JAVA_SE基础——62.String类的构造方法
下面我先列出初学者目前用到的构造方法 String 的构造方法: String() 创建一个空内容 的字符串对象. String(byte[] bytes) 使用一个字节数组构建一个字 ...
- js判断操作系统windows,ios,android(笔记)
使用JS判断用户使用的系统是利用浏览器的userAgent. navigator.userAgent:userAgent 获取了浏览器用于 HTTP 请求的用户代理头的值. navigator.pla ...
- ASP.NET CORE 自定义视图组件(ViewComponent)注意事项
*红色字体为固定命名,蓝色为一般命名规则,黄色为ASP.NET CORE 默认查找文件名 概要:1.简单ViewComponent的用法 2.ViewComponent控制器返回值 3.注意事项 1 ...
- Django REST framework+Vue 打造生鲜超市(二)
三.Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 djangorestframework和相关依赖mark,filter pillow 图片处理 pip in ...
- TortoiseGit安装与使用
公司的源码是在码云上,平时进行项目源码管理和团队开发都会使用到GIT,花了一天时间才将Git搞明白,这是一个工具,我在这里就简单说一下,其安装使用方法,也是对自己学习的总结;本文章适合于刚接触GIT的 ...
- SpringCloud的DataRest(一)
一.概念与定义 Spring Data Rest 基于Spring Data的repository,可以把 repository 自动输出为REST资源, 这样做的好处: 可以免去大量的 contro ...